Группа "Стол заказов MQL"

Рейтинг 2087



РЕКОМЕНДУЮ



Скрипт "Быстрое переключение шаблона внутри окна графика"

Приветствую, Андрей!

Нужен скрипт или индикатор, который позволяет последовательно переключать шаблоны в активном окне графика, путем нажатия «горячих» клавиш, заданных в коде данного скрипта (индикатора).
Зачем он нужен?
Чтобы не перегружать график индикаторами в поисках закономерностей и при этом не клацать каждый раз на «Панель управления» переключая внимание на выбор нужного шаблона. Т.е. основа шаблона будет одна и также, только на каждом шаблоне будет присутствовать свой (отдельный) набор индикаторов.

Образно выражаясь, чтобы зрение было,
как тут (c 0:39 по 0:50):


а не как тут:


Благо дарю!
  • +1
  • Просмотров: 2541
  • 10 ноября 2020, 23:23
  • USDPump
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Советник по индикатору 123Patterns
Следующая запись в группе  
Советник золотой крест
10 ноября 2020
12 ноября 2020

Комментарии (8)

+
0
Ищу поручителя!
avatar

  9  USDPump Автор Сообщений: 62

  • 10 ноября 2020, 23:32
+
0
Случайно посмотрел дальше 50 минуты, ну ты блин хочешь «хищником» стать.
Там уже есть кнопка шаблоны
avatar

  12  Slava78 Сообщений: 598

  • 11 ноября 2020, 06:34
+
0
Все правильно, кнопка «Шаблоны» есть. Я как раз и говорил о нежелательности переключении внимания с графика на «Панель инструментов», в поисках кнопки «Шаблоны» и выборе нужного шаблона.

Для чего он нужен?
Чтобы на каждый найденный в сети интересный индикатор, не заказывать в столе заказов советник, который несколько раз протестируешь, убедишься, что он сливает и пойдешь искать следующий «грааль», чтобы с ним вновь вернуться в стол заказов). Потому что это бестолковое занятие — загружать человека работой, в успешности работы которой ты сам не уверен. Сперва же надо самому убедится, руками попробовать, а потом на советники замахиваться. Возможно я могу ошибаться, но на одном из mql форумов встречал один показательный диалог:
Вопрос mql-спецу: Через ваши руки прошли тысячи советников, почему бы вам не использовать один из них для заработка и больше не работать?
Ответ: Мне ли не знать, что 98% из них сливают.

Чего хочется добиться?
К примеру, нашёл я некоторую закономерность, между движением цены и первым тестируемым индикатором. Собрал статистику профитных и убыточных сделок, переключился на второй шаблон, где уже расположен второй тестируемый индикатор, собрал еще более точную статистику. И так шаг за шагом, выявил такие закономерности в движении цены и используемых индикаторах, чтобы улучшить статистику профитных сделок.

Нашёл, издалека напоминающий функционалом, инструмент только для переключения между графиками. Называется ChartSwitcher st2050 v2. Ниже приложу код. Возможно его можно так «подкрутить», чтобы переключались именно шаблоны в одном окне графика.

P.S. Если, по вашему мнению, я ошибаюсь в своих рассуждениях и иду в тупик, дайте кто-нибудь знать, я попробую понять вашу точку зрения, потому что еще «новичок» и готов внимательно (вдумчиво) прислушиваться к более опытным коллегам.
avatar

  9  USDPump Автор Сообщений: 62

  • 11 ноября 2020, 14:31
+
0
//+------------------------------------------------------------------+
//
//  st2050 chart swither
//  v1 - basic
//  v1.1 - beta release (AS and arrow keys)
//  v2 - WASD version (AD + WS jump to next/prev symbol)
//
//+------------------------------------------------------------------+

#include <WinUser32.mqh>
#import "user32.dll"
int GetTopWindow(int hWnd);
#import


#property indicator_chart_window
#property description "st2050 from forexsystemsru.com"
#property description "------------------------------------------------------------------------------------------------------------------"
#property description "Navigate charts with WASD and arrows keys on keyboard:"
#property description "A/D - previous/next chart"
#property description "W/S - previous/next symbol (if correctly grouped)"

extern string Info = "Experimental params - rename tabs (not required)";
extern bool RenameTabs = false;
extern bool RenameTabs_Lower = false; 
extern bool RenameTabs_Comma = false;
extern bool RenameTabs_Space = true;

long Mas_i[100];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

int init()
{
   return(0);
}

int deinit()
{
   return(0);
}


//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
  return(0);
}

void RenameTabs_()
{
   long currChart_ID=ChartFirst();
   int hChartParent;
   int _period;
   string _symbol, _symbolX;
   for(int i=0;i<100;i++)
     {
      _period=ChartPeriod(currChart_ID);
      _symbol=ChartSymbol(currChart_ID);
      hChartParent = GetParent(WindowHandle(_symbol,_period));
      _symbolX = _symbol;
      if (RenameTabs_Lower) StringToLower(_symbolX);
      if (RenameTabs_Comma) _symbolX = _symbolX + ",";
      if (RenameTabs_Space) _symbolX = _symbolX + " ";
      
      SetWindowTextW(hChartParent,_symbolX+getTfAsString(_period));
      currChart_ID=ChartNext(currChart_ID);
      if(currChart_ID==-1) break;
     }
}


//---------------------------------------------------------------------------------------------
//  Expert ChartEvent function
//---------------------------------------------------------------------------------------------
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{

  if (id==CHARTEVENT_KEYDOWN)
  {

    long _WindowID = 0;

    if ((int(lparam)==65)|| (int(lparam)==37))
    { 
      //_WindowID = GetChartID("prev");
      _WindowID = GetChartID2(-1);
    }

    if ((int(lparam)==68) || (int(lparam)==39))
    { 
      //_WindowID = GetChartID("next");
      _WindowID = GetChartID2(1);
    }

    if ((int(lparam)==83) || (int(lparam)==40))
    { 
      _WindowID=GetChartIDnextSymbol(-1);
    }

    if ((int(lparam)==87) || (int(lparam)==38))
    { 
      _WindowID=GetChartIDnextSymbol(1);
    }

    if (_WindowID>0)
    {
      ChartSetInteger(_WindowID,CHART_BRING_TO_TOP,0,true);
      ChartRedraw(_WindowID);
      if (RenameTabs) RenameTabs_();
    }
  }

  if (id==CHARTEVENT_CHART_CHANGE)
  {
      if (RenameTabs) RenameTabs_();
  }

}

string getTfAsString( int _tf)
{

   if (_tf == PERIOD_M1) {return "M1";}
   if (_tf == PERIOD_M5) {return "M5";}
   if (_tf == PERIOD_M15) {return "M15";}
   if (_tf == PERIOD_M30) {return "M30";}
   if (_tf == PERIOD_H1) {return "H1";}
   if (_tf == 120) {return "H2";}
   if (_tf == PERIOD_H4) {return "4";}
   if (_tf == 480) {return "H8";}
   if (_tf == 720) {return "12";}
   if (_tf == PERIOD_D1) {return "D1";}
   if (_tf == PERIOD_W1) {return "W1";}
   if (_tf == PERIOD_MN1) {return "MN1";}
   
   return "--";

}



//+------------------------------------------------------------------+
//| Get Chart ID function                                            |
//+------------------------------------------------------------------+

long GetChartID2(int offset)
{
   int i=0,limit=99,thisChartIDarr=0, maxChartIDarr=-1;
   long chartID = ChartFirst();
   long thisChartID = ChartID();
   
   while(i<limit)
   {
     Mas_i[i]=chartID;
     if (chartID==thisChartID) thisChartIDarr=i;
     chartID=ChartNext(chartID);
     if ((maxChartIDarr==-1)&&(chartID==-1)) maxChartIDarr=i;
     i++;
   }
   
   i=thisChartIDarr+offset;
   
   if (offset>0)   
   {
     if (i>maxChartIDarr) i=i-maxChartIDarr-1;
   }
   if (offset<0)
   {
     if (i<0) i=maxChartIDarr+i+1;
   }
   
   return(Mas_i[i]);

}

long GetChartIDnextSymbol(int direction)
{

   int i=0,limit=99,thisChartIDarr=0, maxChartIDarr=-1;
   long chartID = ChartFirst();
   long thisChartID = ChartID();
   long targetChartID=-1;
   string thisSymbol = ChartSymbol(thisChartID);
   
   //filling ChartID array
   while(i<limit)
   {
     Mas_i[i]=chartID;
     if (chartID==thisChartID) thisChartIDarr=i;
     chartID=ChartNext(chartID);
     if ((maxChartIDarr==-1)&&(chartID==-1)) maxChartIDarr=i;
     i++;
   }
   
   if (direction>0)
   //just find next symbol
   {
      for(i=thisChartIDarr; i<=maxChartIDarr; i++) 
      {
        if ( thisSymbol!=ChartSymbol(Mas_i[i]) )
        {
          targetChartID=Mas_i[i];
          break;
        }
      }
   }

   if (direction<0)
   //ooo!
   {
      string targetSymbol="";
      int targetArrID=0;
   
      //try to find prev chart with other symbol
      for(i=thisChartIDarr; i>=0; i--) 
      {
        if ( thisSymbol!=ChartSymbol(Mas_i[i]) )
        {
          if(targetSymbol=="") targetSymbol=ChartSymbol(Mas_i[i]);
          if (targetSymbol!="")
          {
            if (i==0) targetChartID=Mas_i[0];
            else
            {
              if (ChartSymbol(Mas_i[i])!=targetSymbol)
              {
                targetChartID=(Mas_i[i+1]);
                break;
              }
            }
          
          }
        }
      }

      //in not foung
      //find first tab from right before symbol change
      if (targetChartID==-1)
      {
        targetSymbol=ChartSymbol(Mas_i[maxChartIDarr]);
        for(i=maxChartIDarr; i>=0; i--) 
        {
          if (ChartSymbol(Mas_i[i])!=targetSymbol)
          {
            targetChartID=(Mas_i[i+1]);
            break;
          }
        }
      }

   }
       
   if (targetChartID==-1) targetChartID=Mas_i[0];
   return(targetChartID);
}


//-----------------------------------------------------------------
// first try function, not used
//-----------------------------------------------------------------
long GetChartID(string type)
  {
//---
   long currChart, prevChart=ChartFirst();
   long nextChart, thisChart = ChartID();
   int i=0,limit=100;
   if(type=="this")
   {
    return(thisChart);
   }
   nextChart = ChartNext(thisChart)<0 ? prevChart:ChartNext(thisChart);
   if(type=="next")
   {
    return(nextChart);
   }

   while(i<limit)
   {
    currChart=ChartNext(prevChart);
    if(currChart<0 || currChart==thisChart) break;
    prevChart=currChart;
    i++;
   }
//---
   return(prevChart);
  }

//-----------------------------------------------------------------
// second try function, not used
//-----------------------------------------------------------------
long GetChartID2(int fromChartID, string type)
  {
//---
   long currChart, prevChart=ChartFirst();
   long nextChart, thisChart = fromChartID;
   int i=0,limit=100;
   if(type=="this")
   {
    return(thisChart);
   }
   nextChart = ChartNext(thisChart)<0 ? prevChart:ChartNext(thisChart);
   if(type=="next")
   {
    return(nextChart);
   }

   while(i<limit)
   {
    currChart=ChartNext(prevChart);
    if(currChart<0 || currChart==thisChart) break;
    prevChart=currChart;
    i++;
   }
//---
   return(prevChart);
avatar

  9  USDPump Автор Сообщений: 62

  • 11 ноября 2020, 14:32
+
0
Можно открыть несколько графиков с разными шаблонами и переключаться
avatar

  12  Slava78 Сообщений: 598

  • 11 ноября 2020, 18:30
+
0
Можно и так, если вариантов других нет.
Может подскажите: как на истории, по клавише f12 заставить синхронно двигаться графики разных т/ф для одной пары (без тестера)? Или только тестер, без вариантов.

avatar

  9  USDPump Автор Сообщений: 62

  • 11 ноября 2020, 21:29
+
0
Почитайте
www.mql5.com/ru/articles/1436
Очень полезная статья для начала изучения написания советников.
Там же несколько советников. Весь код разбит на блоки.
Есть блок откуда берутся сигналы для открытия позиций или выставления ордеров:
//+----------------------------------------------------------------------------+
//|  Возвращает торговый сигнал:                                               |
//|     2 - закрывай продажу                                                   |
//|     1 - покупай                                                            |
//|     0 - сиди, кури бамбук                                                  |
//|    -1 - продавай                                                           |
//|    -2 - закрывай покупку                                                   |
//|  Параметры:                                                                |
//|    sym - наименование инструмента ("" - текущий символ)                    |
//|    tf  - таймфрейм                ( 0 - текущий таймфрейм)                 |
//+----------------------------------------------------------------------------+
int GetTradeSignal(string sym="", int tf=0) {
  int bs=0;
  if (sym=="") sym=Symbol();

  // Блок анализа с присвоением значения переменной bs

  return(bs);
}

В этом блоке пишите и тестируете сигналы любых индикаторов.
Для начала остальные блоки можете не трогать.
avatar

  16  ssg Сообщений: 817

  • 11 ноября 2020, 16:15
+
0
Благодарю.
avatar

  9  USDPump Автор Сообщений: 62

  • 11 ноября 2020, 21:57

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари