Построение графика с произвольными значениями таймфрейма в МТ3/4

 
Здравствуйте All. Подскажите решение !
Для тех.анализа требуется график с произвольным (настраеваемым) таймфреймом. Допустим от 1 минуты до 999 минут, от 1 часа до 999 и т.д. Как его в МТ реализовать?
И второе: как у графика отключить масштабирование и зафиксировать его ( как по вертикали так и по горизонтали).
Спасибо.
 
По периодам графика - поищите скрипт period_converter.
А масштаб графика фиксируется в свойствах грайика (пр. кнопка мыши на графике - меню "Свойства" или F8)
 
Спасибо, komposter, что откликнулись.
По масштабу вопрос исчерпан.
period_converter нашел и нашел, что для изменения таймфрейма в коде меняется значение ExtPeriodMultiplier.
Это то что надо, но одна загвоздка - скрипт запускается но изменений на графике никаких:( - нет достаточных знаний по работе с кодом и с МТ4.
Подскажите, кто знает, где об этом почитать, или перелопачивать весь инет и конференции по теме?
 
СПАСИБО !!!
 
Теперь остался открытым вопрос, как привязать график к коннкретной минуте/часу начала отсчета не обрезая данные слева. К примеру есть график М144 и как ему (графику/индикатору) указать начало отсчета минуту 2006.01.06 15:51 ?
Спасибо.
 
Чуть подправить код скрипта, чтоб он данные до определённого времени не трогал ;)
В цикл, в котором идёт перебор баров вставить что-то типа:
if ( Time[i] < StrToTime(2006.01.06 15:51) ) { continue; }
 
Довольно громоздко получается... каждый сигнал поправлять код.
А можно-ли сделать так, чтоб точку отсчета задавать в самом period_converter как и таймфрейм задается.
Например если точка отсчета 0 - то и вопросов нет, а если YYYY.MM.DD HH:MM - то от этого тика как влево так и вправо по оси времени и конвертировать.
Если это сделать не сложно, то кусок кода, который вставить надо, as is процитируйте.
 
Не будет-ли любезен, кто-нибудь знающий, куда вставить строку, приведенную Уважаемым komposter
указать ЭТО место в коде period_converter
Чуть подправить код скрипта, чтоб он данные до определённого времени не трогал ;)
В цикл, в котором идёт перебор баров вставить что-то типа:

if ( Time[i] < StrToTime(2006.01.06 15:51) ) { continue; }


//+------------------------------------------------------------------+
//|                                             Period_Converter.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#property show_inputs
#include <WinUser32.mqh>

extern int ExtPeriodMultiplier=3; // new period multiplier factor
int        ExtHandle=-1;
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
   int    i, start_pos, i_time, time0, last_fpos, periodseconds;
   double d_open, d_low, d_high, d_close, d_volume, last_volume;
   int    hwnd=0,cnt=0;
//---- History header
   int    version=400;
   string c_copyright;
   string c_symbol=Symbol();
   int    i_period=Period()*ExtPeriodMultiplier;
   int    i_digits=Digits;
   int    i_unused[13];
//----  
   ExtHandle=FileOpenHistory(c_symbol+i_period+".hst", FILE_BIN|FILE_WRITE);
   if(ExtHandle < 0) return(-1);
//---- write history file header
   c_copyright="(C)opyright 2003, MetaQuotes Software Corp.";
   FileWriteInteger(ExtHandle, version, LONG_VALUE);
   FileWriteString(ExtHandle, c_copyright, 64);
   FileWriteString(ExtHandle, c_symbol, 12);
   FileWriteInteger(ExtHandle, i_period, LONG_VALUE);
   FileWriteInteger(ExtHandle, i_digits, LONG_VALUE);
   FileWriteInteger(ExtHandle, 0, LONG_VALUE);       //timesign
   FileWriteInteger(ExtHandle, 0, LONG_VALUE);       //last_sync
   FileWriteArray(ExtHandle, i_unused, 0, 13);
//---- write history file
   periodseconds=i_period*60;
   start_pos=Bars-1;
   d_open=Open[start_pos];
   d_low=Low[start_pos];
   d_high=High[start_pos];
   d_volume=Volume[start_pos];
   //---- normalize open time
   i_time=Time[start_pos]/periodseconds;
   i_time*=periodseconds;
   for(i=start_pos-1;i>=0; i--)
     {
      time0=Time[i];
      if(time0>=i_time+periodseconds || i==0)
        {
         if(i==0 && time0<i_time+periodseconds)
           {
            d_volume+=Volume[0];
            if (Low[0]<d_low)   d_low=Low[0];
            if (High[0]>d_high) d_high=High[0];
            d_close=Close[0];
           }
         last_fpos=FileTell(ExtHandle);
         last_volume=Volume[i];
         FileWriteInteger(ExtHandle, i_time, LONG_VALUE);
         FileWriteDouble(ExtHandle, d_open, DOUBLE_VALUE);
         FileWriteDouble(ExtHandle, d_low, DOUBLE_VALUE);
         FileWriteDouble(ExtHandle, d_high, DOUBLE_VALUE);
         FileWriteDouble(ExtHandle, d_close, DOUBLE_VALUE);
         FileWriteDouble(ExtHandle, d_volume, DOUBLE_VALUE);
         FileFlush(ExtHandle);
         cnt++;
         if(time0>=i_time+periodseconds)
           {
            i_time=time0/periodseconds;
            i_time*=periodseconds;
            d_open=Open[i];
            d_low=Low[i];
            d_high=High[i];
            d_close=Close[i];
            d_volume=last_volume;
           }
        }
       else
        {
         d_volume+=Volume[i];
         if (Low[i]<d_low)   d_low=Low[i];
         if (High[i]>d_high) d_high=High[i];
         d_close=Close[i];
        }
     } 
   FileFlush(ExtHandle);
   Print(cnt," record(s) written");
//---- collect incoming ticks
   int last_time=LocalTime()-5;
   while(IsStopped()==false)
     {
      int cur_time=LocalTime();
      //---- check for new rates
      if(RefreshRates())
        {
         time0=Time[0];
         FileSeek(ExtHandle,last_fpos,SEEK_SET);
         //---- is there current bar?
         if(time0<i_time+periodseconds)
           {
            d_volume+=Volume[0]-last_volume;
            last_volume=Volume[0]; 
            if (Low[0]<d_low) d_low=Low[0];
            if (High[0]>d_high) d_high=High[0];
            d_close=Close[0];
           }
         else
           {
            //---- no, there is new bar
            d_volume+=Volume[1]-last_volume;
            if (Low[1]<d_low) d_low=Low[1];
            if (High[1]>d_high) d_high=High[1];
            //---- write previous bar remains
            FileWriteInteger(ExtHandle, i_time, LONG_VALUE);
            FileWriteDouble(ExtHandle, d_open, DOUBLE_VALUE);
            FileWriteDouble(ExtHandle, d_low, DOUBLE_VALUE);
            FileWriteDouble(ExtHandle, d_high, DOUBLE_VALUE);
            FileWriteDouble(ExtHandle, d_close, DOUBLE_VALUE);
            FileWriteDouble(ExtHandle, d_volume, DOUBLE_VALUE);
            last_fpos=FileTell(ExtHandle);
            //----
            i_time=time0/periodseconds;
            i_time*=periodseconds;
            d_open=Open[0];
            d_low=Low[0];
            d_high=High[0];
            d_close=Close[0];
            d_volume=Volume[0];
            last_volume=d_volume;
           }
         //----
         FileWriteInteger(ExtHandle, i_time, LONG_VALUE);
         FileWriteDouble(ExtHandle, d_open, DOUBLE_VALUE);
         FileWriteDouble(ExtHandle, d_low, DOUBLE_VALUE);
         FileWriteDouble(ExtHandle, d_high, DOUBLE_VALUE);
         FileWriteDouble(ExtHandle, d_close, DOUBLE_VALUE);
         FileWriteDouble(ExtHandle, d_volume, DOUBLE_VALUE);
         FileFlush(ExtHandle);
         //----
         if(hwnd==0)
           {
            hwnd=WindowHandle(Symbol(),i_period);
            if(hwnd!=0) Print("Chart window detected");
           }
         //---- refresh window not frequently than 1 time in 2 seconds
         if(hwnd!=0 && cur_time-last_time>=2)
           {
            PostMessageA(hwnd,WM_COMMAND,33324,0);
            last_time=cur_time;
           }
        } 
     }      
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void deinit()
  {
   if(ExtHandle>=0) { FileClose(ExtHandle); ExtHandle=-1; }
  }
//+------------------------------------------------------------------+
 
Примерно так:
extern int ExtPeriodMultiplier=3; // new period multiplier factor
int        ExtHandle=-1;
.................
extern string StartTime = "2006.01.06 15:51"; //дата начала "сборки" файла истории
............
.............
   for(i=start_pos-1;i>=0; i--)
     {
      time0=Time[i];
      if ( time0 < StrToTime(StartTime) ) { continue; } //вот СЮДА


Итого 2 строки. Не проверял. Может не работать ;)

 
Спасибо за разъяснения, но, как всегда не все гладко.
С
extern string StartTime = "2006.01.06 15:51"; //дата начала "сборки" файла истории



разобрался. Перед выполнением запрашивает дату начала перебора и т.д. - эта часть работает,
а вот с

for(i=start_pos-1;i>=0; i--)
     {
      time0=Time[i];
      if ( time0 < StrToTime(StartTime) ) { continue; } //вот СЮДА



сложнее. Если без { continue; } , то скрипт запускается , но в результатах история с одним баром, да и та
не открывается, а если с { continue; }, то скрипт не запускается вообще.

Ниже кусок кода, с которым вообще не запускается скрипт.

i_time=Time[start_pos]/periodseconds;
   i_time*=periodseconds;
   for(i=start_pos-1;i>=0; i--)
     {
      time0=Time[i];
      if(time0<StrToTime(StartTime)){continue;} // <-- ЭТО МЕСТО, КОТОРОЕ НЕ РАБОТАЕТ :(  HELP!
        {
         if(i==0 && time0<i_time+periodseconds)
           {
            d_volume+=Volume[0];
            if (Low[0]<d_low)   d_low=Low[0];
            if (High[0]>d_high) d_high=High[0];
            d_close=Close[0];
           }
         last_fpos=FileTell(ExtHandle);
         last_volume=Volume[i];
         FileWriteInteger(ExtHandle, i_time, LONG_VALUE);
         FileWriteDouble(ExtHandle, d_open, DOUBLE_VALUE);
Причина обращения: