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

Ugar

Гуру форума
а если использовать время компьютера?
Если код советника находится в OnTick(), то он выполняется с приходом тика по текущему символу. То есть если нет тиков в начале свечи, то и код советника не будет выполняться.
Если код в OnTimer(), то он выполняется с периодичностью запрограммированной в таймере, независимо от того есть тик или нет.
 

Cemen4yk1

Местный житель
Если код советника находится в OnTick(), то он выполняется с приходом тика по текущему символу. То есть если нет тиков в начале свечи, то и код советника не будет выполняться.
Если код в OnTimer(), то он выполняется с периодичностью запрограммированной в таймере, независимо от того есть тик или нет.

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

vladradon

Программист
Он таймер лучше использовать в связке с Онтиком, если тиков нет то сервер может послать нас по любому запросу с пометкой офквот, для этого рекомедуется проверять время прихода последнего тика
Согласен - проверено на обоих языках - без тиков не работает... Я рекомендую запускать основной код в цикле типа while с использованием кнопки стоп, которая тормознет цикл - это работает и обрабатывает все графики с минимальной задержкой - насколько комп позволяет.
 

RV_aka_rvn

Активный участник
Вопрос знатокам, как распознать "цвет свечи" на нулевом баре (программно естественно, а не визуально)?
 

seronn

Новичок форума
Уважаемые программисты! Подскажите, как заставить советник закрыться именно на той же свече, где он был открыт?
Объясняю. Предположим, я догадываюсь куда относительно цены открытия ордера двинется свеча текущего таймфрейма, ордер на свече в нужном месте выставил. Нужно закрыть ордер по цене закрытия свечи, т.е. по цене iClose, т.к. движение на следующей свече неизвестно. Принципиально закрытие именно на текущей свече, а не на открытии новой(понимаю, цена та же, но это важно) Как это реализовать в советнике?
 
Последнее редактирование:

expforex

Программиров
Уважаемые программисты! Подскажите, как заставить советник закрыться именно на той же свече, где он был открыт?
Объясняю. Предположим, я догадываюсь куда относительно цены открытия ордера двинется свеча текущего таймфрейма, ордер на свече в нужном месте выставил. Нужно закрыть ордер по цене закрытия свечи, т.е. по цене iClose, т.к. движение на следующей свече неизвестно. Принципиально закрытие именно на текущей свече, а не на открытии новой(понимаю, цена та же, но это важно) Как это реализовать в советнике?

ловить закрытие на текущем баре Вы не сможете, потому что даже если смотреть пару секунд до закрытия свечи - может не быть тика,
соответственно нужно ловить закрытие на следующем тике следующего бара
потому что цена закрытия предыдущего бара = 99% цене открытия следующего бара

поэтому можно так:
sy= символ
op = тип операции (бай селл)
mn = Магик
void CurentBarClose(string sy="0",int op=-1,int mn=-1)
{
datetime t;
int i,k=OrdersTotal();

if(sy=="" || sy=="0") sy=Symbol();
for(i=0; i<k; i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==sy)
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if(op<0 || OrderType()==op)
{
if(mn<0 || OrderMagicNumber()==mn)
{
t=OrderOpenTime();
if(iBarShift(sy,0,t,True)==1)OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,clrNONE);
}
}
}
}
}
}

}

где вызов функции можно делать так:
CurentBarClose(Symbol(),-1,-1);

а что же 1 % = это гепы.
 
Последнее редактирование:

Rennela

Новичок форума
Сегодня у меня советник сбился. Поменял таймфрейм с M30 на H1 появилась запись в логах MQL(потом прочитал) :uninit reason 3, после этого он выставил неправильный лот и слил часть прибыли. Вопрос: эта запись uninit reason 3 нормальна при смене таймфрейма и может она быть причиной слива, или просто советник коряво написан?(хотя по другим парам работал нормально и код не сбивался-на таймфреймы не переходил). Подскажите кто в курсе.
 

expforex

Программиров
Сегодня у меня советник сбился. Поменял таймфрейм с M30 на H1 появилась запись в логах MQL(потом прочитал) :uninit reason 3, после этого он выставил неправильный лот и слил часть прибыли. Вопрос: эта запись uninit reason 3 нормальна при смене таймфрейма и может она быть причиной слива, или просто советник коряво написан?(хотя по другим парам работал нормально и код не сбивался-на таймфреймы не переходил). Подскажите кто в курсе.

uninit reason 3 - в переводе - причина деинициализции, тоесть говорится о том что был сменен тф - а советник открыл неправильный лот потому что в нем какой то глюк. ТФ здесь не при чем и uninit reason 3 тоже
 

_SERG_

Активный участник
ловить закрытие на текущем баре Вы не сможете, потому что даже если смотреть пару секунд до закрытия свечи - может не быть тика,
соответственно нужно ловить закрытие на следующем тике следующего бара
потому что цена закрытия предыдущего бара = 99% цене открытия следующего бара

поэтому можно так:
sy= символ
op = тип операции (бай селл)
mn = Магик
void CurentBarClose(string sy="0",int op=-1,int mn=-1)
{
datetime t;
int i,k=OrdersTotal();

if(sy=="" || sy=="0") sy=Symbol();
for(i=0; i<k; i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==sy)
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if(op<0 || OrderType()==op)
{
if(mn<0 || OrderMagicNumber()==mn)
{
t=OrderOpenTime();
if(iBarShift(sy,0,t,True)==1)OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,clrNONE);
}
}
}
}
}
}

}

где вызов функции можно делать так:
CurentBarClose(Symbol(),-1,-1);

а что же 1 % = это гепы.

Зачем так сложно?
Если доступен исходник, дописать секцию OnTick(),
и если наступила 59-я секунда закрыть, чЁ там хотелось.
Про начало интервала, по вкусу писателя, как от там планирует исчисляться.
Если не доступен исходняк,
написать сову, код в OnTick() которой, по неким признакам, кроет
всё на той же 59-й секунде.
Ну, и прицепить ее к счёту отдельно.
Деттак.оО
 
Последнее редактирование:

Volkodrak

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

Прошу не судить строго, я еще не спец в программировании. Только учусь. Написал индюка. Но проблема в том, что он не обновляется. То есть новые свечи появляются, а индюк их не обрабатывает. Надо сменить таймфрейм или переключиться между инструментами, тогда индикатор дорисуется. Подскажите, в чем может быть проблема? И еще одна непонятка. Если хочу поменять местами инструменты или перевернуть индикатор (например использую Inst_1_1 = 1/Inst_1_1), то на некоторых таймфреймах перестает отрисовываться средняя на индикаторе (везде отрисовывается, а на H4 и D1 - нет). Может кто то подскажет что это может быть? :/ Вроде ерунда, две строчки кода эта средняя, но никак не могу понять что с ней не так :/

Вот код:

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[])
{

int i,limit;
limit = rates_total - prev_calculated;
if(prev_calculated > 0)
limit++;

for(i = 0; i < limit; i++)
{
double Inst_1_1 = iClose(Instrument_1_1, 0, i);
if(Inst_Per_1_1 == true) Inst_1_1 = 1/Inst_1_1;

double Inst_1_2 = iClose(Instrument_1_2, 0, i);
if(Inst_Per_1_2 == true) Inst_1_2 = 1/Inst_1_2;

Korel_Buffer[ i ]=Inst_1_1 / Inst_1_2;

if(Buffers == 2)
{
double Inst_2_1 = iClose(Instrument_2_1, 0, i);
if(Inst_Per_2_1 == true) Inst_2_1 = 1/Inst_2_1;

double Inst_2_2 = iClose(Instrument_2_2, 0, i);
if(Inst_Per_2_2 == true) Inst_2_2 = 1/Inst_2_2;

Korel_Buffer2[ i ]=(Inst_2_1 / Inst_2_2) + Podnyat_Graf;
}
}

if(Ris_Srednyaya == true)
{
for(i = 0; i < limit; i++)
{
int j = 0;
double Summa = 0;

for(j = 0; j < Max_Sred; j++)
{
Summa = Summa + Korel_Buffer[i+j];
}
Srednyaya[ i ] = Summa/j;
}
}
return(rates_total);
}
 

AlexeyVik

Программист mql4 mql5
Зачем так сложно?
Если доступен исходник, дописать секцию OnTick(),
и если наступила 59-я секунда закрыть, чЁ там хотелось.
Про начало интервала, по вкусу писателя, как от там планирует исчисляться.
Если не доступен исходняк,
написать сову, код в OnTick() которой, по неким признакам, кроет
всё на той же 59-й секунде.
Ну, и прицепить ее к счёту отдельно.
Деттак.оО
Влад и начал с объяснения почему так может не получиться, или получится не всегда... Довольно часто встречаются случаи когда последнюю секунду бара и даже 2, тик отсутствует и OnTick() не срабатывает.
Если уж и ловить последнюю секунду бара то в функции OnTimer()
 

Rennela

Новичок форума
Просматриваю исходники советников для примера(учусь) и в половине случаев start начинается с void, другая с int -вопрос №1: так как правильно писать int start() или void start()? На этом форуме смотрел, на MQL4 форуме смотрел - у каждого свое мнение. Или просто писать int start- и хуже не будет. В скрипте я думаю можно и void, т.к. start там запускается один раз в начале, тогда вопрос №2:чем отличаются в скрипте void OnStart() и void start()? или второй вариант в скрипте не допустим?
 

ansol

Местный знаток
Просматриваю исходники советников для примера(учусь) и в половине случаев start начинается с void, другая с int -вопрос №1: так как правильно писать int start() или void start()? На этом форуме смотрел, на MQL4 форуме смотрел - у каждого свое мнение. Или просто писать int start- и хуже не будет. В скрипте я думаю можно и void, т.к. start там запускается один раз в начале, тогда вопрос №2:чем отличаются в скрипте void OnStart() и void start()? или второй вариант в скрипте не допустим?

Кнопка F1 сломалась?
start - в старых версиях использовалась. Пока еще поддерживается для совместимости, но пора бы уже на "правильный" вариант всё перетащить:
OnStart

Функция OnStart() является обработчиком события Start, которое автоматически генерируется только для запущенных на выполнение скриптов. Должна иметь тип void, параметров не имеет:



void OnStart();


Для функции OnStart() допустимо указывать тип возвращаемого значения int.
и
Start

Событие Start – это специальное событие для активизации скрипта после его загрузки. Это событие обрабатывается функцией OnStart. Событие Start экспертам и пользовательским индикаторам не посылается.
 

zliden

Новичок форума
Приветствую!
Есть сова.
Торгует стоповыми отложками.
Как переделать, чтобы торговала рыночными?
 

_SERG_

Активный участник
Влад и начал с объяснения почему так может не получиться, или получится не всегда... Довольно часто встречаются случаи когда последнюю секунду бара и даже 2, тик отсутствует и OnTick() не срабатывает.
Если уж и ловить последнюю секунду бара то в функции OnTimer()

Алексей, перечитай сообщение внимательно.

Сообщение от expforex ловить закрытие на текущем баре Вы не сможете, потому что даже если смотреть пару секунд до закрытия свечи - может не быть тика,
соответственно нужно ловить закрытие на следующем тике следующего бара
потому что цена закрытия предыдущего бара = 99% цене открытия следующего бара
Там ничего про OnTimer() не написано.
А то, что окончание одного временнОго интервала является началом следующего, таки я с этим тожэ согласен.:laugh:
Можно не на 59 секунде закрывать, а на нулевой.:laugh:
Я на время, здесь внимание акцентирую.
 
Последнее редактирование:
Верх