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

Fairy

Прохожий
Благодарю за ваше внимание Г-да программисты.

Вопрос:
До 600 билда проблем особо не было. Но с его появлением у 90% моих индикаторов перестал работать counted_bars.
3 Месяца ломала голову и придумала разбивать код на части, вводя его порциями через iCustom. Таким образом необходимые мне индикаторы опять заработали через counted_bars.
Но есть ряд индикаторов, которым мне нужно добавить TimeFrame. Но тут у меня плывут все линии.
Первый iCustom я получаю из кода RSI. В нем видимо вся проблема. Пыталась заменить его на iRSI c добавлением counted_bars, но через iRSI я получаю совершенно не те параметры для работы индикатора, так как в этом случае надо указывать буфер. А буфер занят параметром mode.
Потому в итоге в конечном коде у меня есть просто набор буферов, работающих через iCustom, и counted_bars прекрасно со своей работой справляется. Но вот TimeFrame который нужен позарез заставляет все линии плыть. Может подскажите мне какую не будь формулу для оптимизации значения TimeFrame чтобы линии не плыли?
 

owjedi

Интересующийся
Может ли советник работать без привязки к окну графика

Подскажите пожалуйста кто в "теме":
Может ли советник работать без привязки к окну графика?
Через какую функцию вернуть факт получения тика по любому инструменту счета, возможно ли это?
Я написал простенький советник, но работает он у меня только на графике, а я хочу не открывать десятки графиков и запускать его в них, а чтобы он сам производил мониторинг инструментов счета.
Есть ли какие-нибудь стандартные функции через которые это можно реализовать?
Какие функции обработки событий использовать?
 

Cemen4yk1

Местный житель
Подскажите пожалуйста кто в "теме":
Может ли советник работать без привязки к окну графика?
Через какую функцию вернуть факт получения тика по любому инструменту счета, возможно ли это?
Я написал простенький советник, но работает он у меня только на графике, а я хочу не открывать десятки графиков и запускать его в них, а чтобы он сам производил мониторинг инструментов счета.
Есть ли какие-нибудь стандартные функции через которые это можно реализовать?
Какие функции обработки событий использовать?
ну на 1 график та его повесить всёравно придётся, а "обращатся" он может к любым "символам" есть же Symbol() и пляшите от него
 

owjedi

Интересующийся
ну на 1 график та его повесить всёравно придётся, а "обращатся" он может к любым "символам" есть же Symbol() и пляшите от него

Symbol() возвращает имя символа текущего графика. А я то от графика и хочу отвязаться и обрабатывать тики полученные по другим символам счета.
Есть у меня функция индикатора, туда же через запятую символы не впишешь. Надо переменную, переменной присвоить символы. Вот тут и вопрос в какой момент советник понимает, что поступил тик по символу не принадлежащему данному графику, но указанному мной в переменной.
Или я все не так понимаю.
И еще подскажите, пожалуйста, функция Start срабатывает при поступлении любого тика в терминале по счету или тика графика на котором прикреплен советник. Или надо какой-то другой обработчик событий использовать. Есть onTick, но не могу понять как он работает и чем отличается от Start.
 

Ugar

Гуру форума
Symbol() возвращает имя символа текущего графика. А я то от графика и хочу отвязаться и обрабатывать тики полученные по другим символам счета.
Есть у меня функция индикатора, туда же через запятую символы не впишешь. Надо переменную, переменной присвоить символы. Вот тут и вопрос в какой момент советник понимает, что поступил тик по символу не принадлежащему данному графику, но указанному мной в переменной.
Или я все не так понимаю.
И еще подскажите, пожалуйста, функция Start срабатывает при поступлении любого тика в терминале по счету или тика графика на котором прикреплен советник. Или надо какой-то другой обработчик событий использовать. Есть onTick, но не могу понять как он работает и чем отличается от Start.
В советнике OnTick и Start обе эти функции выполняются одинаково, с приходом тика по символу на графике которого он стоит.
Как вариант есть OnTimer(). Он по времени.
Можно сравнивать прошлую цену с текущей по любому символу, если цена изменилась, значит по нему есть тик.
 
Последнее редактирование:

_SERG_

Активный участник
Symbol() возвращает имя символа текущего графика. А я то от графика и хочу отвязаться и обрабатывать тики полученные по другим символам счета.
Есть у меня функция индикатора, туда же через запятую символы не впишешь. Надо переменную, переменной присвоить символы. Вот тут и вопрос в какой момент советник понимает, что поступил тик по символу не принадлежащему данному графику, но указанному мной в переменной.
Или я все не так понимаю.
И еще подскажите, пожалуйста, функция Start срабатывает при поступлении любого тика в терминале по счету или тика графика на котором прикреплен советник. Или надо какой-то другой обработчик событий использовать. Есть onTick, но не могу понять как он работает и чем отличается от Start.

У данного вопроса есть варианты.
Сам такой вопрос раньше задавал.
Определись с целями и выбери решение.
Решения: "Надстройка" или циклический опрос инструментов.
Отличаются реализацией. Можешь все котировки из МТ4 в PIP толкать и там своим приложением обрабатывать, со всеми вытекающими. (Ну пропустишь одну котировку, что это завалит всю систему?)
 
Последнее редактирование:

dimon_777

Прохожий
Добрый вечер!
Составил функцию - гляньте пожалуйста правильно ли

int Bar_Order() //фунция - был ли открыт ордер на текущем баре
{
RefreshRates();
int order = 0; //сколько ордеров открывалось на текущем баре (обнуляем)
datetime time_open = 0; //время открытия последнего ордера(обнуляем)
datetime otk_bar = Time[0]; //узнаем время открытия текущего бара
for(int i=OrdersHistoryTotal()-1; i >=0; i --) //выбираем из истории последний закрытый ордер
{
if(OrderSelect(i,SELECT_BY_POS, MODE_HISTORY)==true) //если выбрали...
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)//если выбрали...
time_open = OrderOpenTime(); //узнаем время открытия последнего ордера
if(time_open >= otk_bar) order=1; //возвращаем order=1 - был открыт ордер на текущем баре
else order=0; // order=0 - не открывался ордер на текущем баре
}
return(order);
}
 

dimon_777

Прохожий
пока ждал ответ понял в чем ошибка:
эти две переменных надо было объявить в начале , а не в функции

datetime time_open , otk_bar;

перед

int OnInit()
 

owjedi

Интересующийся
У данного вопроса есть варианты.
Сам такой вопрос раньше задавал.
Определись с целями и выбери решение.
Решения: "Надстройка" или циклический опрос инструментов.
Отличаются реализацией. Можешь все котировки из МТ4 в PIP толкать и там своим приложением обрабатывать, со всеми вытекающими. (Ну пропустишь одну котировку, что это завалит всю систему?)

Большое спасибо. С целями определился. Пока вопрос c мультивалютной работой моего советника решил вот так:

int start()
{
int _symbolsTotal = SymbolsTotal(false); // true – только символы в MarketWatch
int i;
for (i=0;i<_symbolsTotal;i++)
{
string _symbolName = SymbolName(i,false); // номер в списке / true – только символы в MarketWatch
\\--------------------------------------------------
Мой советник (_symbolName);
\\-------------------------------------------------
}
return (0);
}
 

_SERG_

Активный участник
Большое спасибо. С целями определился. Пока вопрос c мультивалютной работой моего советника решил вот так:

int start()
{
int _symbolsTotal = SymbolsTotal(false); // true – только символы в MarketWatch
int i;
for (i=0;i<_symbolsTotal;i++)
{
string _symbolName = SymbolName(i,false); // номер в списке / true – только символы в MarketWatch
\\--------------------------------------------------
Мой советник (_symbolName);
\\-------------------------------------------------
}
return (0);
}

Ну это только перебор символов рынка, по поступившей котировке, и никак не мультивалютник. А что касается "Мой советник (_symbolName);" то именно здесь и суть будет. Надо рассмотреть, как это на самом деле работает, а не как ты об этом думаешь. Обработку ордеров советника, котировки по инструментам, обновление цен...... и т.д.
 
Последнее редактирование:

ViMax

Прохожий
Доброго дня, уважаемые!

Подскажите, пожалуйста...
Как и где и какую функцию прописать в советнике, что бы он проверял, входной параметр MagicNumber?
Пример:
if MagicNumber=AccountNumber*2-12345

Т.е. получается, что MagicNumber, будет для разных счетов, разный.

Заранее благодарен!
 

vladradon

Программист
Доброго дня, уважаемые!

Подскажите, пожалуйста...
Как и где и какую функцию прописать в советнике, что бы он проверял, входной параметр MagicNumber?
Пример:
if MagicNumber=AccountNumber*2-12345

Т.е. получается, что MagicNumber, будет для разных счетов, разный.

Заранее благодарен!

Магик обычно проверяется при закрытии ордеров или подсчете профита или суммарного лота - т.е. в функциях каких-то при наличии уже открытых ордеров. Магик для разных счетов может быть одинаковый - он и нужен для того, чтобы на одном счете и одном инструменте торгов различать ордера от разных сов или по направлению торгов (разделение по бай и селл) или и то и другое. Вот к примеру простая функция закрытия всех ордеров с заданным магиком.
void closeall()
{
for (int cnt = OrdersTotal()-1 ; cnt >= 0; cnt--)
{
int x=OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderSymbol() == Symbol() && (OrderMagicNumber() == Magic)
{
if(OrderType()==OP_BUY) x=OrderClose(OrderTicket(),OrderLots(),Bid,3,Blue);
if(OrderType()==OP_SELL) x=OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);
}
}
}
 

kamilkz

Почетный гражданин
Приветствую всех!
Недавно начал изучать программирование, сейчас в начальной (ясельной) стадии.
У меня просьба: нужна функция для определения расстояния от цены до ближайшего отложенного ордера.
Как оформить - меня затрудняет. Помогите, пожалуйста. Заранее благодарю.
 

vladradon

Программист
Приветствую всех!
Недавно начал изучать программирование, сейчас в начальной (ясельной) стадии.
У меня просьба: нужна функция для определения расстояния от цены до ближайшего отложенного ордера.
Как оформить - меня затрудняет. Помогите, пожалуйста. Заранее благодарю.
int Spread()
{
int a=-1, b=0;
int r;
for (r=0;r<OrdersTotal();r++)
{
if(OrderSelect(r,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol() == Symbol() && (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)) b=MathAbs(Bid-OrderOpenPrice())/_Point;
if (b>0 && a<0) a=b;
if (a>0 && b>0 && a>b) a=b;
}
}
return(a);
}
Как вариант. Вернет -1, если не найдет отложенников, либо расстояние в пунктах до ближайшего.
 

owjedi

Интересующийся
Ну это только перебор символов рынка, по поступившей котировке, и никак не мультивалютник. А что касается "Мой советник (_symbolName);" то именно здесь и суть будет. Надо рассмотреть, как это на самом деле работает, а не как ты об этом думаешь. Обработку ордеров советника, котировки по инструментам, обновление цен...... и т.д.

Так и есть, меня перебор то подумать и заставил. И спросить не знал как и посмотреть негде. Сам советник строю на Ишимоку, по моему ему все равно на какой паре работать. Обработка ордеров, котировки по инструментам, обновление цен все это важно, но это второй этап. Самое главное, что он пересечения тенкан и киджун с подтверждением чикоуспан по всем инструментам ищет и на почту уведомления мне отправляет. А Ваш мультивалютник работает? Я видел вы моим вопросом постов 100 назад задались.
 

vladradon

Программист
Спасибо большое.
Помогло хоть? Я функцию чирканул чисто по твоим данным, что ты описал в вопросе, но в ней нет проверки меджика и разграничений между buy и sell из отложенников. Добавить мной перечисленное не сложно, но придется уже не один параметр выводить и функцию в разряд void прописать. В любом случае удачи!
 

_SERG_

Активный участник
Так и есть, меня перебор то подумать и заставил. И спросить не знал как и посмотреть негде. Сам советник строю на Ишимоку, по моему ему все равно на какой паре работать. Обработка ордеров, котировки по инструментам, обновление цен все это важно, но это второй этап. Самое главное, что он пересечения тенкан и киджун с подтверждением чикоуспан по всем инструментам ищет и на почту уведомления мне отправляет. А Ваш мультивалютник работает? Я видел вы моим вопросом постов 100 назад задались.

Всё поместил в OnTimer(), по факту зациклил.
 

owjedi

Интересующийся
Всё поместил в OnTimer(), по факту зациклил.

OnTimer() должен срабатывать если торговля закрыта или нет?

Я тоже сегодня в него поместил:

void OnTimer()
{
Print("Сработал таймер на выполнение алгоритма");

А сообщения в журнале не вижу.

Он разве по природе своей не циклически работает?

Сталкивались с тем, что алгоритм в тестере работает без ошибок, а на счете вообще не работает? В тестере пересечения по всем инструментам в журнал пишет. А на счете молчит ни в журнал ни на почту, а я жду от него писем с сигналами, думал нет еще пересечений, смотрю так по 3-м парам фунту, йене и евро. А сегодня случайно тестил по сегодняшний день и в тесте каждый день по 3 сигнала по всяким парам и акциям. По информации с журнала тестера все сигналы на своих инструментах-графиках фактически есть, а терминал на VPS молчал все эти дни.
 
Верх