Нестандартные графики - страница 2

 
Это не моя методика. Скрипт period_converter - "разработка" самих разработчиков МТ4. Так что благодарите авторов МТ4.
 
;) комбинация из пальцев ("=ДАРАГОЙ,конвертыровать я умею и смотреть гарфик умею,")
оказывается неуместной ? Учись читать (в т.ч. между строк)
 
2 Merab
Открой график М1. Прицепи к нему period_converter с параметром, который тебе нужен. 45, если тебе нужен ТФ М45, 120, если тебе нужен ТФ Н2.


открыл график М1 EURUSD прицепил на него period_converter с параметром М10. Затем открыл грайфик EURUSD M10 - через минуту в журнале появляется надпись "2006.05.09 16:02:31 Script period_converter EURUSD,M1: removed " и никаких движений на М10 не замечалось ни внутри этой минуты, ни, естественно, потом.
Запускаем еще раз
2006.05.09 16:07:24 Script period_converter EURUSD,M1: loaded successfully
и опять
2006.05.09 16:08:04 Script period_converter EURUSD,M1: removed

Никаких движений на графике М10

Потом открой оффлайн график - меню "Файл\Открыть автономно". Найди там (если, допустим прицепил конвертер на EURUSD) инструмент с именем EURUSD,M45 для первого случая, или EURUSD,H2 для второго случая. На этих нестандартных фреймах увидишь всё, что тебе нужно. Т.е. график будет двигаться, как любой стандартный ТФ. Можешь вешать любых индюков и экспертов. Всё будет работать. Только минутное окно закрывать ни в коем случае нельзя. В этом случае твой нестандартный фрейм "шевелиться" перестанет. Если тебе надо одновременно наблюдать несколько нестандартных фреймов, тогда тебе надо открыть несколько минутных и на каждый минутный повесить конвертер с нужным периодом. А потом открыть все соответствующие "автономные". Все нестандартные будут "шевелиться". Не очень удобно, но других вариантов нет. Но хоть такой есть...


Вопрос, что я делаю не так и почему не работает?
 
Да... Снимается скрипт при появлении нового тика. А нестандартный график обновляется только вручную - правая кнопа мыши - Обновить
 
Скрипт (Script) - программа, предназначенная для одноразового выполнения каких-либо действий. В отличие от экспертов, скрипты запускаются не потиково, а по запросу. Скрипты хранятся в директории каталог_терминала\experts\scripts


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

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

Я не знаю, какой вариант период конвертера Вы использовали
 
Вот этот

//+------------------------------------------------------------------+
//|                                             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; }
  }
//+------------------------------------------------------------------+
 
2006.05.09 17:02:29 period_converter EURUSD,M1: removed
2006.05.09 17:02:29 period_converter EURUSD,M1: deinitialized
2006.05.09 17:02:29 period_converter EURUSD,M1: expert stopped
2006.05.09 17:02:29 period_converter EURUSD,M1: dll calls are not allowed; 'user32.dll'-'PostMessageA'
2006.05.09 17:02:29 period_converter EURUSD,M1: Chart window detected
2006.05.09 17:02:28 period_converter EURUSD,M1: 453 record(s) written
2006.05.09 17:02:23 period_converter EURUSD,M1: loaded successfully
 
Скрипт (Script) - программа, предназначенная для одноразового выполнения каких-либо действий. В отличие от экспертов, скрипты запускаются не потиково, а по запросу. Скрипты хранятся в директории каталог_терминала\experts\scripts


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


ВОт здесь надо почитать - "MQL4: Вызовы функций из библиотеки"
 

2006.05.09 17:02:29 period_converter EURUSD,M1: expert stopped
2006.05.09 17:02:29 period_converter EURUSD,M1: dll calls are not allowed; 'user32.dll'-'PostMessageA'

Вот и ответ.
Надо разрешить вызовы dll в свойствах скрипта.
Причина обращения: