Ответ
 
Опции темы
19.10.2016, 18:01
Регистрация: 13.03.2009 / Сообщений: 2,320
Поблагодарили 1,944 раз(а) / Репутация: 2019
Сообщение от Семен12345 Посмотреть сообщение
а если использовать время компьютера?
Если код советника находится в OnTick(), то он выполняется с приходом тика по текущему символу. То есть если нет тиков в начале свечи, то и код советника не будет выполняться.
Если код в OnTimer(), то он выполняется с периодичностью запрограммированной в таймере, независимо от того есть тик или нет.

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
Ugar вне форума Ответить с цитированиемОтветить с цитированием  
26.10.2016, 05:59
Аватар для Cemen4yk1
Cemen4yk1 Местный житель
Регистрация: 18.09.2014 / Сообщений: 226
Поблагодарили 246 раз(а) / Репутация: 247
Сообщение от Ugar Посмотреть сообщение
Если код советника находится в OnTick(), то он выполняется с приходом тика по текущему символу. То есть если нет тиков в начале свечи, то и код советника не будет выполняться.
Если код в OnTimer(), то он выполняется с периодичностью запрограммированной в таймере, независимо от того есть тик или нет.
Он таймер лучше использовать в связке с Онтиком, если тиков нет то сервер может послать нас по любому запросу с пометкой офквот, для этого рекомедуется проверять время прихода последнего тика

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

https://www.mql5.com/ru/market/product/17748
Cemen4yk1 на форуме Ответить с цитированиемОтветить с цитированием  
26.10.2016, 07:10
Аватар для vladradon
vladradon Активный участник
Регистрация: 12.02.2015 / Сообщений: 127
Поблагодарили 52 раз(а) / Репутация: 52
Сообщение от Cemen4yk1 Посмотреть сообщение
Он таймер лучше использовать в связке с Онтиком, если тиков нет то сервер может послать нас по любому запросу с пометкой офквот, для этого рекомедуется проверять время прихода последнего тика
Согласен - проверено на обоих языках - без тиков не работает... Я рекомендую запускать основной код в цикле типа while с использованием кнопки стоп, которая тормознет цикл - это работает и обрабатывает все графики с минимальной задержкой - насколько комп позволяет.
vladradon вне форума Ответить с цитированиемОтветить с цитированием  
26.10.2016, 18:06
Аватар для RV_aka_rvn
RV_aka_rvn Новичок форума
Регистрация: 20.05.2016 / Сообщений: 92
Поблагодарили 12 раз(а) / Репутация: 13
Вопрос знатокам, как распознать "цвет свечи" на нулевом баре (программно естественно, а не визуально)?
RV_aka_rvn вне форума Ответить с цитированиемОтветить с цитированием  
26.10.2016, 19:54
Регистрация: 09.08.2012 / Адрес: Ua_Khm / Сообщений: 1,758
Поблагодарили 9,105 раз(а) / Репутация: 9110
Сообщение от RV_aka_rvn Посмотреть сообщение
Вопрос знатокам, как распознать "цвет свечи" на нулевом баре (программно естественно, а не визуально)?
Что больше: Open или Close. (текущая цена у свечи, что формируется равна Close).
mobidik на форуме Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
RV_aka_rvn (27.10.2016)
27.10.2016, 08:03
Аватар для RV_aka_rvn
RV_aka_rvn Новичок форума
Регистрация: 20.05.2016 / Сообщений: 92
Поблагодарили 12 раз(а) / Репутация: 13
Сообщение от mobidik Посмотреть сообщение
Что больше: Open или Close. (текущая цена у свечи, что формируется равна Close).
Спасибо за пояснения это естественно, а с доджами, меня они больше интересуют, как, "кресты" бывают и "зелёные" и "красные"....
RV_aka_rvn вне форума Ответить с цитированиемОтветить с цитированием  
27.10.2016, 09:10
Регистрация: 09.08.2012 / Адрес: Ua_Khm / Сообщений: 1,758
Поблагодарили 9,105 раз(а) / Репутация: 9110
Сообщение от RV_aka_rvn Посмотреть сообщение
Спасибо за пояснения это естественно, а с доджами, меня они больше интересуют, как, "кресты" бывают и "зелёные" и "красные"....
А у доджа есть цвет?
Open = Close
mobidik на форуме Ответить с цитированиемОтветить с цитированием  
27.10.2016, 09:40
Аватар для AlexeyVik
AlexeyVik Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,710 раз(а) / Репутация: 3706
Сообщение от mobidik Посмотреть сообщение
А у доджа есть цвет?
Open = Close
Есть.
Миниатюры:
Нажмите на изображение для увеличения
Название: 00.png
Просмотров: 17
Размер:	38.5 Кб
ID:	257006  
AlexeyVik на форуме Ответить с цитированиемОтветить с цитированием  
27.10.2016, 09:45
Регистрация: 09.08.2012 / Адрес: Ua_Khm / Сообщений: 1,758
Поблагодарили 9,105 раз(а) / Репутация: 9110
Сообщение от AlexeyVik Посмотреть сообщение
Есть.
ну конечно есть... иначе был бы невидимкой, это суслика может быть не видно.
mobidik на форуме Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
AlexeyVik (27.10.2016)
28.10.2016, 15:42
Аватар для seronn
seronn Новичок форума
Регистрация: 26.02.2014 / Сообщений: 55
Поблагодарили 16 раз(а) / Репутация: 17
Уважаемые программисты! Подскажите, как заставить советник закрыться именно на той же свече, где он был открыт?
Объясняю. Предположим, я догадываюсь куда относительно цены открытия ордера двинется свеча текущего таймфрейма, ордер на свече в нужном месте выставил. Нужно закрыть ордер по цене закрытия свечи, т.е. по цене iClose, т.к. движение на следующей свече неизвестно. Принципиально закрытие именно на текущей свече, а не на открытии новой(понимаю, цена та же, но это важно) Как это реализовать в советнике?

Последний раз редактировалось seronn; 28.10.2016 в 15:45.
seronn вне форума Ответить с цитированиемОтветить с цитированием  
28.10.2016, 15:53
Аватар для expforex
expforex Программиров
Регистрация: 11.01.2009 / Сообщений: 2,134
Поблагодарили 2,092 раз(а) / Репутация: 2150
Сообщение от seronn Посмотреть сообщение
Уважаемые программисты! Подскажите, как заставить советник закрыться именно на той же свече, где он был открыт?
Объясняю. Предположим, я догадываюсь куда относительно цены открытия ордера двинется свеча текущего таймфрейма, ордер на свече в нужном месте выставил. Нужно закрыть ордер по цене закрытия свечи, т.е. по цене 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 % = это гепы.

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Советники на заказ! admin@expforex.com
Говорим Спасибо

Последний раз редактировалось expforex; 28.10.2016 в 15:55.
expforex вне форума Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
seronn (28.10.2016)
28.10.2016, 19:27
Аватар для Rennela
Rennela Активный участник
Регистрация: 04.01.2013 / Адрес: 俄罗斯 / Сообщений: 137
Поблагодарили 30 раз(а) / Репутация: 31
Сегодня у меня советник сбился. Поменял таймфрейм с M30 на H1 появилась запись в логах MQL(потом прочитал) :uninit reason 3, после этого он выставил неправильный лот и слил часть прибыли. Вопрос: эта запись uninit reason 3 нормальна при смене таймфрейма и может она быть причиной слива, или просто советник коряво написан?(хотя по другим парам работал нормально и код не сбивался-на таймфреймы не переходил). Подскажите кто в курсе.
Rennela на форуме Ответить с цитированиемОтветить с цитированием  
28.10.2016, 19:46
Аватар для expforex
expforex Программиров
Регистрация: 11.01.2009 / Сообщений: 2,134
Поблагодарили 2,092 раз(а) / Репутация: 2150
Сообщение от Rennela Посмотреть сообщение
Сегодня у меня советник сбился. Поменял таймфрейм с M30 на H1 появилась запись в логах MQL(потом прочитал) :uninit reason 3, после этого он выставил неправильный лот и слил часть прибыли. Вопрос: эта запись uninit reason 3 нормальна при смене таймфрейма и может она быть причиной слива, или просто советник коряво написан?(хотя по другим парам работал нормально и код не сбивался-на таймфреймы не переходил). Подскажите кто в курсе.
uninit reason 3 - в переводе - причина деинициализции, тоесть говорится о том что был сменен тф - а советник открыл неправильный лот потому что в нем какой то глюк. ТФ здесь не при чем и uninit reason 3 тоже

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Советники на заказ! admin@expforex.com
Говорим Спасибо
expforex вне форума Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
Rennela (28.10.2016)
29.10.2016, 01:12
Аватар для _SERG_
_SERG_ Активный участник
Регистрация: 21.07.2009 / Сообщений: 264
Поблагодарили 82 раз(а) / Репутация: 82
Сообщение от expforex Посмотреть сообщение
ловить закрытие на текущем баре Вы не сможете, потому что даже если смотреть пару секунд до закрытия свечи - может не быть тика,
соответственно нужно ловить закрытие на следующем тике следующего бара
потому что цена закрытия предыдущего бара = 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-й секунде.
Ну, и прицепить ее к счёту отдельно.
Деттак.

Последний раз редактировалось _SERG_; 29.10.2016 в 01:16.
_SERG_ на форуме Ответить с цитированиемОтветить с цитированием  
29.10.2016, 06:06
Аватар для Volkodrak
Volkodrak Прохожий
Регистрация: 29.10.2016 / Сообщений: 1
Поблагодарили 0 раз(а) / Репутация: 1
Доброго времени суток, господа программисты!

Прошу не судить строго, я еще не спец в программировании. Только учусь. Написал индюка. Но проблема в том, что он не обновляется. То есть новые свечи появляются, а индюк их не обрабатывает. Надо сменить таймфрейм или переключиться между инструментами, тогда индикатор дорисуется. Подскажите, в чем может быть проблема? И еще одна непонятка. Если хочу поменять местами инструменты или перевернуть индикатор (например использую 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);
}
Volkodrak вне форума Ответить с цитированиемОтветить с цитированием  
29.10.2016, 06:36
Аватар для AlexeyVik
AlexeyVik Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,710 раз(а) / Репутация: 3706
Сообщение от _SERG_ Посмотреть сообщение
Зачем так сложно?
Если доступен исходник, дописать секцию OnTick(),
и если наступила 59-я секунда закрыть, чЁ там хотелось.
Про начало интервала, по вкусу писателя, как от там планирует исчисляться.
Если не доступен исходняк,
написать сову, код в OnTick() которой, по неким признакам, кроет
всё на той же 59-й секунде.
Ну, и прицепить ее к счёту отдельно.
Деттак.
Влад и начал с объяснения почему так может не получиться, или получится не всегда... Довольно часто встречаются случаи когда последнюю секунду бара и даже 2, тик отсутствует и OnTick() не срабатывает.
Если уж и ловить последнюю секунду бара то в функции OnTimer()
AlexeyVik на форуме Ответить с цитированиемОтветить с цитированием  
29.10.2016, 08:11
Аватар для Rennela
Rennela Активный участник
Регистрация: 04.01.2013 / Адрес: 俄罗斯 / Сообщений: 137
Поблагодарили 30 раз(а) / Репутация: 31
Просматриваю исходники советников для примера(учусь) и в половине случаев start начинается с void, другая с int -вопрос №1: так как правильно писать int start() или void start()? На этом форуме смотрел, на MQL4 форуме смотрел - у каждого свое мнение. Или просто писать int start- и хуже не будет. В скрипте я думаю можно и void, т.к. start там запускается один раз в начале, тогда вопрос №2:чем отличаются в скрипте void OnStart() и void start()? или второй вариант в скрипте не допустим?
Rennela на форуме Ответить с цитированиемОтветить с цитированием  
29.10.2016, 08:17
Аватар для ansol
ansol Местный знаток
За призовое место в конкурсе 

Регистрация: 22.04.2010 / Сообщений: 2,016
Поблагодарили 855 раз(а) / Репутация: 841
Сообщение от Rennela Посмотреть сообщение
Просматриваю исходники советников для примера(учусь) и в половине случаев 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 экспертам и пользовательским индикаторам не посылается.
ansol на форуме Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
Rennela (29.10.2016)
29.10.2016, 15:56
Аватар для zliden
zliden Активный участник
Регистрация: 28.08.2011 / Адрес: Эдем / Сообщений: 39
Поблагодарили 23 раз(а) / Репутация: 24
Приветствую!
Есть сова.
Торгует стоповыми отложками.
Как переделать, чтобы торговала рыночными?
zliden вне форума Ответить с цитированиемОтветить с цитированием  
29.10.2016, 16:23
Аватар для _SERG_
_SERG_ Активный участник
Регистрация: 21.07.2009 / Сообщений: 264
Поблагодарили 82 раз(а) / Репутация: 82
Сообщение от AlexeyVik Посмотреть сообщение
Влад и начал с объяснения почему так может не получиться, или получится не всегда... Довольно часто встречаются случаи когда последнюю секунду бара и даже 2, тик отсутствует и OnTick() не срабатывает.
Если уж и ловить последнюю секунду бара то в функции OnTimer()
Алексей, перечитай сообщение внимательно.

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

Последний раз редактировалось _SERG_; 29.10.2016 в 16:53.
_SERG_ на форуме Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
AlexeyVik (30.10.2016)
Ответ

Метки
mql4, mql4 помощь, вопросы mql4


Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Выкл.
Pingbacks are Выкл.
Refbacks are Выкл.



Текущее время: 06:17. Часовой пояс GMT.


Перевод: zCarot
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
SEO by vBSEO