Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2348

 

а кто тему наверх перенес и зачем?


 
Valeriy Yastremskiy #:

а кто тему наверх перенес и зачем?


А сейчас?

Где последнее сообщение позднее по времени, та тема и выше по списку.

 
Artyom Trishkin #:

А сейчас?

Где последнее сообщение позднее по времени, та тема и выше по списку.

Не, в "общие обсуждения", была же в "мкл4" внизу.

ЗЫ вернулась вниз тема)))
 
Подскажите, как исправить проблему с панелью. Например в панель помещается только 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 21


sinput string        delimeter_01=""; // --- Настройки фильтрации ---
#define         noSYMBmarketWath true // Скрыть, если нет в Обзор рынка



// префикс, который будет добавляться к именам всех создаваемых советником графических объектов:
string exprefix="finder";
// массив символов, которые удовлетворяют нашим условиям:
CArrayString arrPanel1;
// индекс текущего символа в массиве arrPanel1:
int panel1val;
// массив, в который мы будем помещать созданные советником графики (пока что один):
CChart charts[];
// массив, в который мы будем помещать указатели на созданные советником графики (пока что один):
long curChartID[];
int levels_count;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
  {
  app.Create(0,APP_NAME,-400,20,0,50,50);  
  }
  
   start_symbols();

//--- create timer
   EventSetTimer(1);
      
//---
   return(INIT_SUCCEEDED);
  }
  
void start_symbols(){
   levels_count=4;
   // устанавливаем в ноль (первый символ в массиве) индекс текущего символа в списке символов:
   panel1val=0;
   // подготавливаем список символов:
   prepare_symbols();
   // удаляем ранее созданные кнопки символов с графика:
   ObjectsDeleteAll(0, exprefix);
   // выводим список символов:
   show_symbols();
   // обновляем график, чтобы увидеть изменения:
   ChartRedraw(0);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(reason!=REASON_CHARTCHANGE){
      ObjectsDeleteAll(0, exprefix);
   }
   EventKillTimer();
   
   
  app.Destroy(reason);
  lit1.Destroy(reason);   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+

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]);
   
}




void OnChartEvent(const int id,         // event ID   
                  const long& lparam,   // event parameter of the long type 
                  const double& dparam, // event parameter of the double type 
                  const string& sparam) // event parameter of the string type 
  { 
  
   switch(id){
      case CHARTEVENT_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;
      case CHARTEVENT_KEYDOWN:
         switch((int) sparam){
            case 45: //x
               ExpertRemove();
               break;
            case 19: //r
               start_symbols();
               break;
         }
         break;
   }

}

void show_symbols(){
   
   // инициализируем переменные для определения координат X и Y
   int 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);
   }
}


 
Valeriy Yastremskiy #:

Не, в "общие обсуждения", была же в "мкл4" внизу.

ЗЫ вернулась вниз тема)))

Эээ нэ знаю, шайтан какой-та

 
Alexey Viktorov #:

Закажите скрипт который будет сохранять скрины, а перед сохранением будет ставить все нужные параметры.

Спасибо, что отозвались!

Надо думать!

С уважением!

 
Tretyakov Rostyslav #:

Пользуйтесь


Спасибо большое, Ростислав!

Вы как всегда - неравнодушны и бескорыстны!

Очень благдарен Вам!

Успехов и удачи во всем!

С уважением!

 
Владимир Казаков #:

Доброго!

Вопрос по 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???

Вам бы справку почитать, а с такими вопросами даже не понятно с чего начать.

Найдите бесплатный индикатор с такой функцией и разберите его.

 
Tretyakov Rostyslav #:
Вам бы справку почитать, а с такими вопросами даже не понятно с чего начать.

Справку читал, не фига не понятно... было понятно бы не спрашивал.

что можно по этому понять?

total

[in]  Количество элементов для вычисления. 0 означает все элементы массива.

ma_period

[in]  Период усреднения для вычисления индикатора.

чем отличаются эти два параметра?? про период понятно, а вот про total нет - для меня это похоже на, то сколько элементов из масива будет загружаться в функцию, но однозначно это не понятно.