Ваши вопросы по языку MQL4

Elvis Burunduk

Элитный участник
Элвис, если б было все так просто... Ты куда пропал? Звякни мне на скайп - есть тема. Ато с прошлого праздника ты так на связь и не выходишь...:nda::D

Сегодня вечером стукну в скайп.
С прошлого праздника загулял, потом навалило работы - башки не поднять, щас вроде раскидался, появилось немного времени.
 

Bullra

Новичок
Кто-нибудь в курсе, есть ли возможность в МТ сделать масштаб еще меньше?
 

Bullra

Новичок
Продублирую вопрос. Еще меньше сделать масштаб графика в метатрейдере с помощью скриптов реально или губу придется закатать?

eurusd-m1-roboforex-cy-ltd.png
 

AlanTrade

Интересующийся
А мне вот интересно, как в таком случае у Вас хоть что-то запустилось в самый первый раз?



Вы как тогда плохо изучили предмет, так и сейчас "не в теме"...
К Вашему сведению, если не ошибаюсь, с 1 апреля 2014 года, метаквоты перестали поддерживать "старый" билд, а в новых, теперешних, нет функции IndicatorCounted().
Вообщем, учите матчасть.
Сообщение от: AlanTrade
МТ4, при включении, запускает все инструменты, init, start (1 раз) и все это на старых данных последнего вашего включения

А мне вот интересно, как в таком случае у Вас хоть что-то запустилось в самый первый раз?

А по какой причине "что-то" не должно запуститься?
 

AlanTrade

Интересующийся
Надо же... оО
Метаквоты, значит, безбожно врут вот здесь _https://book.mql4.com/ru/programm/special
И мне как-то не везет с выполнением start при запуске терминалов в выходные - не показывают комменты, обновляемые при каждом вызове.
В любом случае - прошу предоставить работающий пример кода, который подтвердит ваши слова. Запущу его с отключенным интернетом и убедюсь в коварности MQL.



Кстати, данная хитроумная функция - не костыль для "корявой" имплементации MQL, а оптимизация вычислений в первую очередь тяжелых по расчетам индикаторов.
Надо же...
Метаквоты, значит, безбожно врут вот здесь _https://book.mql4.com/ru/programm/special
И мне как-то не везет с выполнением start при запуске терминалов в выходные - не показывают комменты, обновляемые при каждом вызове.

Нет не врут:
"В экспертах специальная функция init() вызывается (и исполняется) также сразу после старта клиентского терминала и подгрузки исторических данных, после смены финансового инструмента и/или периода графика, после перекомпиляции программы в редакторе MetaEditor, после смены входных параметров из окна настройки эксперта и после смены счёта.

В скриптах специальная функция init() вызывается (и исполняется) сразу после прикрепления к графику финансового инструмента.

В пользовательских индикаторах специальная функция init() вызывается (и исполняется) сразу после старта клиентского терминала, после смены финансового инструмента и/или периода графика, после перекомпиляции программы в редакторе MetaEditor и после смены входных параметров из окна настройки пользовательского индикатора."
Т.е. честно пишут, что в индикаторах init запускается на старых данных, то бишь "криво". На эксперте не проверял.

С везением у вас всё в порядке. Просто в выходные нет тиков.



В любом случае - прошу предоставить работающий пример кода, который подтвердит ваши слова. Запущу его с отключенным интернетом и убедюсь в коварности MQL.

Код:
//+------------------------------------------------------------------+
//|                                         Кривая инициализация.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                                          https:/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https:/"
#property version   "1.00"
#property strict
#property indicator_chart_window

                  
int i,n,iFont_size; 
datetime tText; 
double   dText; 
color     cText;      
string    stText_name,stText;

void CreObjText(string stText_name,string stText,datetime tText,double dText,color cText,int iFont_size)//Фунция создани надписи
   {
   ObjectCreate(stText_name,OBJ_TEXT,0,tText,dText);   
	ObjectSetText(stText_name,stText,iFont_size,0,cText);
	ObjectSetInteger(0,stText_name,OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
    
	}

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
  stText_name="Баг";
  stText="Если текст заканчивается не над баром 0 - Кривая инициализация";
  cText=Red;
  CreObjText(stText_name,stText,Time[0],High[0],cText,iFont_size);
   return(0);
  }//int OnInit()
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   return(rates_total);
  }

//+------------------------------------------------------------------+ 
//| Expert deinitialization function                                 | 
//+------------------------------------------------------------------+ 
void OnDeinit(const int reason) 
  { 
  ObjectsDeleteAll(0,OBJ_RECTANGLE);
  ObjectsDeleteAll(0,"Pivot",0,OBJ_TREND);
  ObjectsDeleteAll(0,"Res",0,OBJ_TREND);
  ObjectsDeleteAll(0,"Sup",0,OBJ_TREND);
  ObjectDelete ("Bend");
  }



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

Только запускать нужно не с выключенным инетом, а с включённым после заметного перерыва в данных.


Кстати, данная хитроумная функция - не костыль для "корявой" имплементации MQL, а оптимизация вычислений в первую очередь тяжелых по расчетам индикаторов.

Согласен, возможно в тяжелых по расчетам индикаторах она и помогает, но в простом индикаторе Volumes от MQ она работает криво. Можете сами убедиться, вставив функцию Print в цикл и посмотреть в логе эксперта значения IndicatorCounted() и количество циклов. Если не получится, на досуге покажу.
 

AlanTrade

Интересующийся
И что? Причем тут гугл, когда должно быть понимание? Единственное, что Вы могли бы ответить, так это то, что данная ф-ция все еще поддерживается терминалом и только. В старых билдах ф-ция IndicatorCounted(), в индикаторах работает совместно с ф-цией start(), т.е., необходимо, как минимум, две ф-ции. Это актуально для билдов до 509. Во всех последующих вместо ф-ции start() уже используется OnCalculate(). Вот тут, Ваше умение пользоваться гуглом Вам поможет, Вы узнаете как она работает и какое возвращает значение, назначение первых двух параметров: rates_total и prev_calculated - с которыми можно провести параллель по отношению к IndicatorCounted() и Bars() и после этого Вам станет понятно, почему перестала использоваться данная ф-ция, но, повторюсь, все еще поддерживается. Так же, по Вашей ссылочке, перейдите на форум и узнаете много нареканий на работу ф-ции IndicatorCounted(), что в итоге, для её использования в индикаторах, метаквоты от неё отказались.
Вы как тогда плохо изучили предмет, так и сейчас "не в теме"...
К Вашему сведению, если не ошибаюсь, с 1 апреля 2014 года, метаквоты перестали поддерживать "старый" билд, а в новых, теперешних, нет функции IndicatorCounted().
Вообщем, учите матчасть.


"В теме". Тема, похоже, вызвала интерес, а вы, похоже, представляете интересы MQ. Это тоже интаресно. (Извините за каламбур).
Нет не ошибаетесь, просто это была Первоапрельская шутка. Возьмите любой новый билд и запустите любой индикатор с функцией IndicatorCounted(), хотя бы Volumes - работает.
Или, для изучения матчасти, откройте справочник MQL4 из этого же билда и посмотрите описание IndicatorCounted() или попытайтесь найти её в устаревших функциях.
Так что учить матчасть полезно всем.

P.S.



И что? Причем тут гугл, когда должно быть понимание? Единственное, что Вы могли бы ответить, так это то, что данная ф-ция все еще поддерживается терминалом и только. В старых билдах ф-ция IndicatorCounted(), в индикаторах работает совместно с ф-цией start(), т.е., необходимо, как минимум, две ф-ции. Это актуально для билдов до 509. Во всех последующих вместо ф-ции start() уже используется OnCalculate(). Вот тут, Ваше умение пользоваться гуглом Вам поможет, Вы узнаете как она работает и какое возвращает значение, назначение первых двух параметров: rates_total и prev_calculated - с которыми можно провести параллель по отношению к IndicatorCounted() и Bars() и после этого Вам станет понятно, почему перестала использоваться данная ф-ция, но, повторюсь, все еще поддерживается. Так же, по Вашей ссылочке, перейдите на форум и узнаете много нареканий на работу ф-ции IndicatorCounted(), что в итоге, для её использования в индикаторах, метаквоты от неё отказались.

Спасибо за информацию, углубляться буду по мере поступления трудностей.
 

vlad_123

Местный знаток
Если не получится, на досуге покажу.

ОМГ... :facepalm:
Пример бесполезно потраченного времени...
Сделайте усилие и вчитайтесь в сообщения, которые соизволили комментировать.
Мои вопросы были связаны с заявлением, что функция start() (так заметно?) выполняется 1 раз при отсутствии тиков.
Цитирование мануала для init() монописуально бесполезно, равно как и код индикатора, в котором отсутствуют обе (!!!) функции, обсуждавшиеся изначально.

И, дабы завершить - дочитайте сообщения до конца, прежде чем отправлять мобидика курить мануал.
Он уже писал, что про отсутствие функции IndicatorCounted() он выразился неправильно и подразумевал не это.
 
Последнее редактирование:

Ugar

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

vlad_123

Местный знаток
Если я правильно понял, стоит задача сделать масштаб графика мельче чем это можно сделать кнопками в терминале.
Скрипты, индикаторы и советники работают в среде терминала. На графике терминала. По этому, эти программы, не могут больше чем может терминал.

Насколько я понял - хочется иметь период меньше минуты.
Имхо, по-быстрому это не получится - надо писать какой-нить советник, который будет из тикового потока формировать файл истории нужного периода, который потом можно будет открыть в терминале.
 

Ugar

Гуру форума
Насколько я понял - хочется иметь период меньше минуты.
Имхо, по-быстрому это не получится - надо писать какой-нить советник, который будет из тикового потока формировать файл истории нужного периода, который потом можно будет открыть в терминале.
Мелкий таймфрейм можно создать, писать свою историю и создавать свой файл истории, специально написанным индикатором или советником. В другом окне открыть этот файл. Конечно же эта задачка не на пол часа программирования.
Но там в вопросе конкретно написано масштаб, а не таймфрейм или период графика. Хотя бывает что люди путают термины, это обычно относится к новичкам. Bullra на форуме уже 5 лет, вряд ли его можно назвать новичком.
 
Последнее редактирование:

AlanTrade

Интересующийся
ОМГ...
Пример бесполезно потраченного времени...
Сделайте усилие и вчитайтесь в сообщения, которые соизволили комментировать.
Мои вопросы были связаны с заявлением, что функция start() (так заметно?) выполняется 1 раз при отсутствии тиков.

Спасибо за совет. Зпишусь к офтальмологу, Он, надеюсь, будет более логичен, если не в MQL, то хоть в беседе.

Цитирование мануала для init() монописуально бесполезно, равно как и код индикатора, в котором отсутствуют обе (!!!) функции, обсуждавшиеся изначально.

Код:
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
  stText_name="Баг";
  stText="Если текст заканчивается не над баром 0 - Кривая инициализация"; 
...
  cText=Red;

Извините, полиписуально не умею по причине отсутствия множества писуалок. А к знакомому офтальмологу, если хотите, могу записать и вас. Хотя, конечно, зрение у вас лучше. Там действительно две лишние буквы - "On" и на init совсем не похоже.

И, дабы завершить - дочитайте сообщения до конца, прежде чем отправлять мобидика курить мануал.
Он уже писал, что про отсутствие функции IndicatorCounted() он выразился неправильно и подразумевал не это.


И, действительно, в завершение разговора, перед мобидиком я почти извинился:
P.S.
Спасибо за информацию, углубляться буду по мере поступления трудностей.,
а, по вопросу объёма и последовательности читаемого текста, замечу, что это моего ума дело.
 

dimik796

Активный участник
Кто знает подскажите как можно индикатор mq4 перевести в формат .cs ?
 

mangold

Активный участник
Конвертер 2calgo.com/Home/Index#converted_indicator
 
Последнее редактирование модератором:

mangold

Активный участник
У вас должен быть скачан сAlgo ( можно скачать на сайте FxPro. Далее в нем открываете создать новый индикатор и скопировать туда конвертированные данные , далее нажимаете собрать и все. Он готов. Далее можно нажать на него и в выпавшем окне посмотреть путь , откроется папка с индикаторами , только при создании нового индикатора задайте ему имя.
 

dimik796

Активный участник
У вас должен быть скачан сAlgo ( можно скачать на сайте FxPro. Далее в нем открываете создать новый индикатор и скопировать туда конвертированные данные , далее нажимаете собрать и все. Он готов. Далее можно нажать на него и в выпавшем окне посмотреть путь , откроется папка с индикаторами , только при создании нового индикатора задайте ему имя.

а вы не могли бы переделать индикатор? пробовал конвертировал и потом собирал показывает ошибку
 
Верх