Подскажите, как исправить проблему с панелью. Например в панель помещается только 12 кнопок, если добавляю 13, то отображение всех кнопок отключается. Как увеличить количество вместимости кнопок, но при этом не увеличивать размер самой панели?
#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>
#include <Controls\ListView.mqh>
#include <Arrays\ArrayString.mqh>
#define APP_NAME "Panel"#define PANEL_HEIGHT 500#define PANEL_WIGHT 300#define ROW_HEIGHT 20#define BTN_HEIGHT (20)
#define BTN_WIDTH (100)
CAppDialog app;
CButton btn1;
CListView lit1;
//--- Общее количество пунктов в списке#define ITEMS_TOTAL2 21sinputstring delimeter_01=""; // --- Настройки фильтрации ---#define noSYMBmarketWath true// Скрыть, если нет в Обзор рынка// префикс, который будет добавляться к именам всех создаваемых советником графических объектов:string exprefix="finder";
// массив символов, которые удовлетворяют нашим условиям:
CArrayString arrPanel1;
// индекс текущего символа в массиве arrPanel1:int panel1val;
// массив, в который мы будем помещать созданные советником графики (пока что один):
CChart charts[];
// массив, в который мы будем помещать указатели на созданные советником графики (пока что один):long curChartID[];
int levels_count;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
{
app.Create(0,APP_NAME,-400,20,0,50,50);
}
start_symbols();
//--- create timerEventSetTimer(1);
//---return(INIT_SUCCEEDED);
}
void start_symbols(){
levels_count=4;
// устанавливаем в ноль (первый символ в массиве) индекс текущего символа в списке символов:
panel1val=0;
// подготавливаем список символов:
prepare_symbols();
// удаляем ранее созданные кнопки символов с графика:ObjectsDeleteAll(0, exprefix);
// выводим список символов:
show_symbols();
// обновляем график, чтобы увидеть изменения:ChartRedraw(0);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
if(reason!=REASON_CHARTCHANGE){
ObjectsDeleteAll(0, exprefix);
}
EventKillTimer();
app.Destroy(reason);
lit1.Destroy(reason);
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//---
}
//+------------------------------------------------------------------+void nextchart(){
levels_count=4;
// если в списке символов есть следующий символ, то открываем его график// иначе закрываем текущий графикif(arrPanel1.Total()>(panel1val+1)){
panel1val++;
showcharts(arrPanel1[panel1val]);
}else{
closecharts();
}
}
void prevchart(){
levels_count=4;
// если в списке символов есть предыдущий символ, то открываем его график// иначе закрываем текущий графикif(arrPanel1.Total()>(panel1val-1) && (panel1val-1)>=0){
panel1val--;
showcharts(arrPanel1[panel1val]);
}else{
closecharts();
}
}
void curchart(){
if(arrPanel1.Total()>panel1val){
showcharts(arrPanel1[panel1val]);
}else{
closecharts();
}
}
void closecharts(){
// если массив графиков, открытых советником, не пуст, тогда...if(ArraySize(charts)){
// последовательно закрываем все графикиfor( int i=0; i<ArraySize(charts); i++ ){
charts[i].Close();
}
// очищаем массив графиковArrayFree(charts);
}
// если массив идентификаторов графиков, открытых советником, не пуст, тогда очищаем егоif(ArraySize(curChartID)){
ArrayFree(curChartID);
}
}
void showcharts(string name){
// если ранее уже были открыты графики, то закрываем их
closecharts();
// открываем график и помещаем в массив curChartID идентификатор данного графика
curChartID[ArrayResize(curChartID,ArraySize(curChartID)+1)-1]=ChartSetSymbolPeriod(0,name,PERIOD_D1 );
// если входной параметр "Открывать графики в виде свечей" равен true,// если входной параметр "Показывать тиковые объемы" равен true,// меняем масштаб графика до наиболее удобногоChartSetInteger( curChartID[ArraySize(curChartID)-1], CHART_SCALE, 2);
//выводим дополнительную информацию на графикstring msg="";
if( StringLen(msg)>0 ){
ChartSetString(curChartID[ArraySize(curChartID)-1], CHART_COMMENT, msg);
}
// подождем треть секунды, чтобы все изменения успели внестисьSleep(333);
// обновляем открытый график, чтобы внести на него все измененияChartRedraw(curChartID[ArraySize(curChartID)-1]);
}
voidOnChartEvent(constint id, // event ID constlong& lparam, // event parameter of the long type constdouble& dparam, // event parameter of the double type conststring& sparam) // event parameter of the string type
{
switch(id){
caseCHARTEVENT_OBJECT_CLICK:
// если в названии кнопки встречается строка, которая содержится во всех графических объектах,// создаваемых нашим советником, тогда...if( StringFind(sparam, exprefix+"btn")>=0 ){
// помещаем в переменную panel1val номер текущей кнопки// то есть, позицию текущего символа в списке символовstring tmpme=sparam;
StringReplace(tmpme, exprefix+"btn", "");
panel1val=(int) tmpme;
// открываем график данного символа
showcharts(ObjectGetString(0,sparam,OBJPROP_TEXT));
}
break;
caseCHARTEVENT_KEYDOWN:
switch((int) sparam){
case45: //xExpertRemove();
break;
case19: //r
start_symbols();
break;
}
break;
}
}
void show_symbols(){
// инициализируем переменные для определения координат X и Yint btn_left=0;
int btn_line=1;
int btn_right=(int) ChartGetInteger(0, CHART_WIDTH_IN_PIXELS)+77;
// для каждого символа в массиве выводим кнопку на график// на кнопке будем писать название символаfor( int i=0; i<arrPanel1.Total(); i++ ){
if( btn_left>btn_right-BTN_WIDTH ){
btn_line++;
btn_left=0;
}
app.Width(PANEL_WIGHT);
app.Height(PANEL_HEIGHT*btn_line);
//--- create
btn1.Create(0,exprefix+"btn"+(string) i,0,0,0+BTN_HEIGHT+btn_left,0,0+BTN_WIDTH*btn_line);
btn1.Width(BTN_WIDTH);
btn1.Height(BTN_HEIGHT);
btn1.Text(arrPanel1.At(i));
app.Add(btn1);
btn_left+=BTN_HEIGHT;
}
}
void prepare_symbols(){
// переменная для временного хранения названия символаstring name;
// обнуляем массив символов, если в нем были какие-либо значения
arrPanel1.Resize(0);
// формируем временный массив tmpSymbols// он будет содержать все доступные символы
CArrayString tmpSymbols;
for( int i=0; i<SymbolsTotal(noSYMBmarketWath); i++ ){
tmpSymbols.Add(SymbolName(i, noSYMBmarketWath));
}
// здесь будет происходить проверка условий// и помещение символа в список символов,// если он удовлетворяет условиямfor( int i=0; i<tmpSymbols.Total(); i++ ){
name=tmpSymbols[i];
// чистим название символа от лишних пробелов// мало ли откуда он мог к нам попастьStringTrimLeft(name);
StringTrimRight(name);
if( !StringLen(name) ){
continue;
}
// далее будет происходить основная фильтрация символов// Скрыть символы, торговля по которым запрещена// если символ удовлетворяет всем нашим условиям, добавляем его в список
arrPanel1.Add(name);
}
}
Вопрос по iMA есть параметр ma_shift- это понятно, сдвигает кривую индикатора на графике относительно текущего бара.
а что делает параметр shift ????
в окне настройки индикатора нет поля для ввода такого параметра...
еще вопрос уже по iMAOnArrayMA:
за что отвечает параметр total???
и в какой последовательности берутся данные из массива цен для расчета
допустим метод расчета Simple, период 5 массив из 100 значений, нумерация стандартная (не серия)
цикл от 0 до 100 приращение +1
ma = IMAOnArray(массив значений, total (????), 5, 0, MODE_SMA, индекс_массива)
индекс_массива = 0 - откуда функция будет брать еще 4 значения для расчета? примет их в 0? или расчет будет проходить в другую сторону те использоваться значения по индексам от 0 до 4???
индекс_массива = 10 - вопрос тот же, для расчета будут взяты значения по индексам от 10 до 6 или от 10 до 14???
и в какой последовательности берутся данные из массива цен для расчета
допустим метод расчета Simple, период 5 массив из 100 значений, нумерация стандартная (не серия)
цикл от 0 до 100 приращение +1
ma = IMAOnArray(массив значений, total (????), 5, 0, MODE_SMA, индекс_массива)
индекс_массива = 0 - откуда функция будет брать еще 4 значения для расчета? примет их в 0? или расчет будет проходить в другую сторону те использоваться значения по индексам от 0 до 4???
индекс_массива = 10 - вопрос тот же, для расчета будут взяты значения по индексам от 10 до 6 или от 10 до 14???
Вам бы справку почитать, а с такими вопросами даже не понятно с чего начать.
Tretyakov Rostyslav #: Вам бы справку почитать, а с такими вопросами даже не понятно с чего начать.
Справку читал, не фига не понятно... было понятно бы не спрашивал.
что можно по этому понять?
total
[in] Количество элементов для вычисления. 0 означает все элементы массива.
ma_period
[in] Период усреднения для вычисления индикатора.
чем отличаются эти два параметра?? про период понятно, а вот про total нет - для меня это похоже на, то сколько элементов из масива будет загружаться в функцию, но однозначно это не понятно.
а кто тему наверх перенес и зачем?
а кто тему наверх перенес и зачем?
А сейчас?
Где последнее сообщение позднее по времени, та тема и выше по списку.
А сейчас?
Где последнее сообщение позднее по времени, та тема и выше по списку.
Не, в "общие обсуждения", была же в "мкл4" внизу.
ЗЫ вернулась вниз тема)))Не, в "общие обсуждения", была же в "мкл4" внизу.
ЗЫ вернулась вниз тема)))Эээ нэ знаю, шайтан какой-та
Закажите скрипт который будет сохранять скрины, а перед сохранением будет ставить все нужные параметры.
Спасибо, что отозвались!
Надо думать!
С уважением!
Пользуйтесь
Спасибо большое, Ростислав!
Вы как всегда - неравнодушны и бескорыстны!
Очень благдарен Вам!
Успехов и удачи во всем!
С уважением!
Доброго!
Вопрос по iMA
есть параметр ma_shift - это понятно, сдвигает кривую индикатора на графике относительно текущего бара.
а что делает параметр shift ????
в окне настройки индикатора нет поля для ввода такого параметра...
еще вопрос уже по iMAOnArrayMA:
за что отвечает параметр total???
и в какой последовательности берутся данные из массива цен для расчета
допустим метод расчета Simple, период 5
массив из 100 значений, нумерация стандартная (не серия)
цикл от 0 до 100 приращение +1
ma = IMAOnArray(массив значений, total (????), 5, 0, MODE_SMA, индекс_массива)
индекс_массива = 0 - откуда функция будет брать еще 4 значения для расчета? примет их в 0? или расчет будет проходить в другую сторону те использоваться значения по индексам от 0 до 4???
индекс_массива = 10 - вопрос тот же, для расчета будут взяты значения по индексам от 10 до 6 или от 10 до 14???
еще вопрос уже по iMAOnArrayMA:
за что отвечает параметр total???
и в какой последовательности берутся данные из массива цен для расчета
допустим метод расчета Simple, период 5
массив из 100 значений, нумерация стандартная (не серия)
цикл от 0 до 100 приращение +1
ma = IMAOnArray(массив значений, total (????), 5, 0, MODE_SMA, индекс_массива)
индекс_массива = 0 - откуда функция будет брать еще 4 значения для расчета? примет их в 0? или расчет будет проходить в другую сторону те использоваться значения по индексам от 0 до 4???
индекс_массива = 10 - вопрос тот же, для расчета будут взяты значения по индексам от 10 до 6 или от 10 до 14???
Вам бы справку почитать, а с такими вопросами даже не понятно с чего начать.
Найдите бесплатный индикатор с такой функцией и разберите его.
Вам бы справку почитать, а с такими вопросами даже не понятно с чего начать.
Справку читал, не фига не понятно... было понятно бы не спрашивал.
что можно по этому понять?
total
[in] Количество элементов для вычисления. 0 означает все элементы массива.
ma_period
[in] Период усреднения для вычисления индикатора.
чем отличаются эти два параметра?? про период понятно, а вот про total нет - для меня это похоже на, то сколько элементов из масива будет загружаться в функцию, но однозначно это не понятно.