Jump to content
Programmer

Общие вопросы по языку MQL

Recommended Posts

MW

Помогите внять:

Сущствует индикатор и в разное время он отображает текущую ситуацию на рынке, как сделать так чтобы этот индикатор мог отобразить свой старт, тоесть когда время равно 00.00?


Жми быка! Дави медведя!

Share this post


Link to post
Share on other sites
Acer80

Здравствуйте. Помогите пожалуйста...облазил весь инет и ничего не нашел.

Проблема в следующем...Есть индикатор, на основании данных индикатора хочу написать советника, но как данные которые возращает индикатор засунуть в советник. Думал что через GV-переменные..но чего-то не получается..Задать я из задал (по F3 их видно), но как их прочитать в советнике ума не приложу..Помогите...ПЛИЗ

Share this post


Link to post
Share on other sites
Programmer

To MW:

 

Уточните вопрос.

1. 00.00 - это начало очередного дня или начало первого бара в истории терминала?

2. Я правильно понимаю, что Вы хотите модифицировать код индикатора так, чтобы он показывал на экране своё значение в какое-то определённое время?

 

Приведите пример, пожалуйста.

Share this post


Link to post
Share on other sites
Programmer

To Acer80:

 

Вы ищите функцию iCustom().

 

2f2f27b2e965bfc36f64a340125882ee.gif

Share this post


Link to post
Share on other sites
Acer80

TO Programmer

Я может криво как-то проблему объяснил..попробую по другому..

У меня индикатор выдает значение, которое я присваиваю глобальной переменной через GlobalVariableSet(это я делаю в индикаторе.....значение к примеру 1,50). Как мне с помощью (GlobalVariableGet возможно) получить это значение в советнике? Потому что на основании этого значение у меня идет анализ открытия длинной или короткой позиции.

А можно как-нить через icq пообщаться?

з.ы. а что возращает функция icustom? у меня значение вернул 2147483647..как его расшифровать?

Share this post


Link to post
Share on other sites
~~SOM~~
TO Programmer

Я может криво как-то проблему объяснил..попробую по другому..

У меня индикатор выдает значение, которое я присваиваю глобальной переменной через GlobalVariableSet(это я делаю в индикаторе.....значение к примеру 1,50). Как мне с помощью (GlobalVariableGet возможно) получить это значение в советнике? Потому что на основании этого значение у меня идет анализ открытия длинной или короткой позиции.

Если GlobalVariableSet("POS", Ask); то

pos1=GlobalVariableGet("POS");

 

Так точно работает.

Share this post


Link to post
Share on other sites
Programmer

Согласен.

Но я бы всё-таки через iCustom() делал. Глобальные переменные - mauvais ton.

Share this post


Link to post
Share on other sites
Acer80

To MOS

Огромное спасибо...все взлетело...супер...

Share this post


Link to post
Share on other sites
~~SOM~~
Согласен.

Но я бы всё-таки через iCustom() делал. Глобальные переменные - mauvais ton.

Вы, наверное. и к GOTO с подозрением относитесь :). Есть такая школа. Лет двадцать ей уже :) :).

Share this post


Link to post
Share on other sites
MW
To MW:

 

Уточните вопрос.

1. 00.00 - это начало очередного дня или начало первого бара в истории терминала?

2. Я правильно понимаю, что Вы хотите модифицировать код индикатора так, чтобы он показывал на экране своё значение в какое-то определённое время?

 

Приведите пример, пожалуйста.

 

1. Начало любого бара из истории в зависимости от таймфрейма.

2. Да правильно, значения нужны когда бар только открылся и без реакции на close.


Жми быка! Дави медведя!

Share this post


Link to post
Share on other sites
Programmer

To MW:

 

Понял. Объясняю.

В инидикаторе есть буфер. Это массив, в котором нумерация начинается с конца и все элементы этого массива сдвигаются влево на 1 при появлении нового бара. Т.е., грубо говоря, усстроено всё так:

1. Рассматриваем какой-то ТФ.

2. Каждому бару истории этого ТФ в инидикаторе поставлена в соответствии ячейка (элемент буфера).

3. Дальше всё зависит от индикатора и того, как он рассчитывается.

Большинство индикаторов усттроены так, что они пересчитываются на каждом тике. Это можно легко определить визуально.

4. В таких индикаторах имеем: пока текущий бар не завершён, значение, содержащееся в соотв. ему ячейке может меняться (если индикатор использует в расчётах тек. бар - например, его цену закрытия - пока бар не завершён, его цена закрытия = тек. рыночной цене Bid). Как только бар завершился значение индикатора на этом баре замораживается (опять же, если это не какой-то специфический индикатор, использующий данные след. баров для расчёта данного).

Поэтому, если Вы хотите узнать значение индикатора в момент открытия бара, надо его куда-то сохранять. Например, в ещё один буфер.

 

Я бы сделал так:

 

//+------------------------------------------------------------------+
//|                                                         1111.mq4 |
//|                                                           Kirill |
//|                                          [email="StockProgrammer@mail.ru"]StockProgrammer@mail.ru[/email] |
//+------------------------------------------------------------------+
#property copyright "Kirill"
#property link      "[email="StockProgrammer@mail.ru"]StockProgrammer@mail.ru[/email]"
#property indicator_chart_window

//.....
double FirstValueBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
 {
  //.....
  SetIndexBuffer(7, FirstValueBuffer);
  return(0);
 }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
 {
  //.....  
  return(0);
 }  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
 {
  int    counted_bars=IndicatorCounted();
  //... расчёт индикатора
  SaveFirstValue();    //сразу после расчёта
  return(0);
 }
//+------------------------------------------------------------------+
void SaveFirstValue()
{
  static datetime lastbar = 0;
  datetime thisbar = Time[0];
  if(lastbar < thisbar)
  {
     FirstValueBuffer[0] = [b]<Требуемый Буфер Индикатора>[/b][0];
     lastbar = thisbar;
  }
}

Share this post


Link to post
Share on other sites
MW

Этот вариант может оказатся неточным, следуя по Вашей наладке сохраняемое значение меняется. Уважаемый Kirill можно ли изобразить тоже самое используя постоянное значение OPEN так как будто других HLC значений этот индикатор в расчёт не берёт? Спасибо.


Жми быка! Дави медведя!

Share this post


Link to post
Share on other sites
MW

Впринципе написаный Вами код работает, но как теперь узнать, как оно было в прошлом? Индикатор будет работать пока работает терминал, как произвести перерасчёт всей истории по барам для нахождения первоначальных значений такого типа?


Жми быка! Дави медведя!

Share this post


Link to post
Share on other sites
Acer80

Скажите, пожалуйста, а есть какая-нить функция, которая бы после точки в переменных double оставляла заданное количество знаков (например 2) ?

Share this post


Link to post
Share on other sites
kivi

У меня вопрос. Вот почитал форум, нашёл сообщение что индекс доллара _DXY отображается в метатрейдере с задержкой на пол часа. Не знаю правда ли, и решил проверить... В поисковике нашёл определение индекса доллара, стал писать индикатор и столкнулся с проблемой. Как в MQL4 число возвести в степень...

P.S. А может я зря изобретаю велосипед, может кто поделится готовым индикатором индексов доллара и евро.

Share this post


Link to post
Share on other sites
Programmer

Ну прям закидали вопросами :biggrin:

Share this post


Link to post
Share on other sites
Programmer

To MW:

 

Этот вариант может оказатся неточным, следуя по Вашей наладке сохраняемое значение меняется.

 

Значение не меняется. Оно рассчитывается в начале бара, затем буфер блокируется и обращения к этой ячейке никогда не происходит.

 

Уважаемый Kirill можно ли изобразить тоже самое используя постоянное значение OPEN так как будто других HLC значений этот индикатор в расчёт не берёт? Спасибо.

 

Можно, если индикатор может быть рассчитан только по ценам Open. Тогда его значение не будет меняться в течении времени формирования данного бара.

 

Впринципе написаный Вами код работает, но как теперь узнать, как оно было в прошлом? Индикатор будет работать пока работает терминал, как произвести перерасчёт всей истории по барам для нахождения первоначальных значений такого типа?

 

Никак. :biggrin:

Бар содержит всего 5 значений - Open, High, Low, Close, Volume.

Share this post


Link to post
Share on other sites
Programmer

To Acer80:

 

Скажите, пожалуйста, а есть какая-нить функция, которая бы после точки в переменных double оставляла заданное количество знаков (например 2) ?

 

NormalizeDouble()

Share this post


Link to post
Share on other sites
Programmer

To kivi:

 

Как в MQL4 число возвести в степень...

 

MathPow()

 

А код пишите - это никогда не врдено.

Share this post


Link to post
Share on other sites
MW

Никак. :biggrin:

Бар содержит всего 5 значений - Open, High, Low, Close, Volume.

Автоматическое перещёлкивание периодов по текущему времени. Можно ли такое замутить для графика котировок? :)


Жми быка! Дави медведя!

Share this post


Link to post
Share on other sites
Programmer

To MW:

 

Можете уточнить вопрос?

Share this post


Link to post
Share on other sites
MW

3 окна один инструмент. 1.Наступает новый день перещёлкивается с недельного периода автоматом на дённый. 2. 4х часовой на часовой 3. час на полчаса. Как только появился Open на старшем в один момент переключило на младший без рук.


Жми быка! Дави медведя!

Share this post


Link to post
Share on other sites
Programmer

To MW:

 

Да, можно. Это делается с помощью библитеки <WinUser32.mqh>

 

//+------------------------------------------------------------------+

//| WinUser32.mqh |

//| Copyright © 2004, MetaQuotes Software Corp. |

//| http://www.metaquotes.net/ |

//+------------------------------------------------------------------+

#define copyright "Copyright © 2004, MetaQuotes Software Corp."

#define link "http://www.metaquotes.net/"

#import "user32.dll"

//---- messages

int SendMessageA(int hWnd,int Msg,int wParam,int lParam);

int SendNotifyMessageA(int hWnd,int Msg,int wParam,int lParam);

int PostMessageA(int hWnd,int Msg,int wParam,int lParam);

void keybd_event(int bVk,int bScan,int dwFlags,int dwExtraInfo);

void mouse_event(int dwFlags,int dx,int dy,int dwData,int dwExtraInfo);

//---- windows

int FindWindowA(string lpClassName ,string lpWindowName);

int SetWindowTextA(int hWnd,string lpString);

int GetWindowTextA(int hWnd,string lpString,int nMaxCount);

int GetWindowTextLengthA(int hWnd);

int GetWindow(int hWnd,int uCmd);

int UpdateWindow(int hWnd);

int EnableWindow(int hWnd,int bEnable);

int DestroyWindow(int hWnd);

int ShowWindow(int hWnd,int nCmdShow);

int SetActiveWindow(int hWnd);

int AnimateWindow(int hWnd,int dwTime,int dwFlags);

int FlashWindow(int hWnd,int dwFlags /*bInvert*/);

int CloseWindow(int hWnd);

int MoveWindow(int hWnd,int X,int Y,int nWidth,int nHeight,int bRepaint);

int SetWindowPos(int hWnd,int hWndInsertAfter ,int X,int Y,int cx,int cy,int uFlags);

int IsWindowVisible(int hWnd);

int IsIconic(int hWnd);

int IsZoomed(int hWnd);

int SetFocus(int hWnd);

int GetFocus();

int GetActiveWindow();

int IsWindowEnabled(int hWnd);

//---- miscelaneouse

int MessageBoxA(int hWnd ,string lpText,string lpCaption,int uType);

int MessageBoxExA(int hWnd ,string lpText,string lpCaption,int uType,int wLanguageId);

int MessageBeep(int uType);

int GetSystemMetrics(int nIndex);

int ExitWindowsEx(int uFlags,int dwReserved);

int SwapMouseButton(int fSwap);

#import

....

 

Ещё почитайте здесь: http://forum.mql4.com/ru/11859

Share this post


Link to post
Share on other sites
Programmer

To Ferum01:

 

MathAbs()

 

Все мат. ф-ии начинаются на Math.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×