Jump to content

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


Recommended Posts

MW

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

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


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

Link to post
Share on other sites
  • Replies 7.6k
  • Created
  • Last Reply

Top Posters In This Topic

  • AntFX

    577

  • sergey1294

    569

  • Ugar68

    517

  • Programmer

    419

Top Posters In This Topic

Popular Posts

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

На счёт проверок, это правильно. Я больше очень практикую, то же нарывался. Но в моём случае у меня советник открывал ордер минимальным лотом вместо нормального, когда замечал, доливаться было поздно.

Основной советник выставляет "сигнальный" отложенный ордер далеко от текущей цены и каждую например, минуту модифицирует у него время экспирации: это может быть текущее время плюс 1 час, или плюс 1 су

Posted Images

Acer80

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

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

Link to post
Share on other sites
Programmer

To MW:

 

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

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

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

 

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

Link to post
Share on other sites
Programmer

To Acer80:

 

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

 

2f2f27b2e965bfc36f64a340125882ee.gif

Link to post
Share on other sites
Acer80

TO Programmer

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

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

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

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

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

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

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

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

pos1=GlobalVariableGet("POS");

 

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

Link to post
Share on other sites
Programmer

Согласен.

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

Link to post
Share on other sites
Acer80

To MOS

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

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

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

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

Link to post
Share on other sites
MW
To MW:

 

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

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

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

 

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

 

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

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


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

Link to post
Share on other sites
Programmer

To MW:

 

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

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

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

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

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

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

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

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

 

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

 

//+------------------------------------------------------------------+
//|                                                         1111.mq4 |
//|                                                           Kirill |
//|                                          [email="[email protected]"][email protected][/email] |
//+------------------------------------------------------------------+
#property copyright "Kirill"
#property link      "[email="[email protected]"][email protected][/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;
  }
}

Link to post
Share on other sites
MW

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


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

Link to post
Share on other sites
MW

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


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

Link to post
Share on other sites
Acer80

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

Link to post
Share on other sites
kivi

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

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

Link to post
Share on other sites
Programmer

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

Link to post
Share on other sites
Programmer

To MW:

 

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

 

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

 

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

 

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

 

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

 

Никак. :biggrin:

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

Link to post
Share on other sites
Programmer

To Acer80:

 

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

 

NormalizeDouble()

Link to post
Share on other sites
Programmer

To kivi:

 

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

 

MathPow()

 

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

Link to post
Share on other sites
MW

Никак. :biggrin:

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

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


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

Link to post
Share on other sites
Programmer

To MW:

 

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

Link to post
Share on other sites
MW

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


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

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

Link to post
Share on other sites
Programmer

To Ferum01:

 

MathAbs()

 

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

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.


×
×
  • Create New...