С чего начать?

 
Добрый день. Решил начать учить MQL4. Для начала поставил задачу лёгкую, но не могу всё равно решить, может поможете. К примеру, бычий тренд как заставить открыться в бай, если текущая цена поднимется выше первой цены предыдущего бара? Не могу найти подходящих функций. Мне кажется должно быть не сложно.
 
Saintsid:
Добрый день. Решил начать учить MQL4. Для начала поставил задачу лёгкую, но не могу всё равно решить, может поможете. К примеру, бычий тренд как заставить открыться в бай, если текущая цена поднимется выше первой цены предыдущего бара? Не могу найти подходящих функций. Мне кажется должно быть не сложно.

Начните с учебника и документации.
 
Saintsid:
К примеру, бычий тренд как заставить открыться в бай, если текущая цена поднимется выше первой цены предыдущего бара? Не могу найти подходящих функций. Мне кажется должно быть не сложно.

Посмотрите функции iClose, iOpen

double iClose( string symbol, int timeframe, int shift)
Возвращает значение цены закрытия указанного параметром shift бара с соответствующего графика (symbol, timeframe). В случае ошибки функция возвращает 0. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError().
Для текущего графика информация о ценах закрытия находится в предопределенном массиве Close[].
Параметры:
symbol - Символьное имя инструмента. NULL означает текущий символ.
timeframe - Период. Может быть одним из периодов графика. 0 означает период текущего графика.
shift -

Индекс получаемого значения из таймсерии (сдвиг относительно текущего бара на указанное количество периодов назад).

==================

if (Ask > iOpen(NULL,0,1) ) //- покупаем ...

 
Благодарю. От этого уже буду отталкиваться.
 
Saintsid:
Добрый день. Решил начать учить MQL4. Для начала поставил задачу лёгкую, но не могу всё равно решить, может поможете. К примеру, бычий тренд как заставить открыться в бай, если текущая цена поднимется выше первой цены предыдущего бара? Не могу найти подходящих функций. Мне кажется должно быть не сложно.

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

Да вроде всё шикарно получается, советник составил, правда он отрицательный после теста, но всё равно прикольно, работает же. Такая скальпинговая стратегия

int sdelkaS;

double cenazak = iClose(NULL,0,1)+4*Point; // разрыв между барами по цене

double dlinabara = iClose(NULL,0,1) - iOpen(NULL,0,1); // Длинна пред. бара

if (cenazak < iOpen(NULL,0,0)) { // Если цена отк. < цены закр. пред. бара

if ( iOpen(NULL,0,1) < iClose(NULL,0,1)) { // Предыдущая свеча БЫЧЬЯ

if (Bid == iOpen(NULL,0,1)) { // Если цена = цены открытия пред. бара

if (dlinabara > 30*Point) // Бары должны быть подлиннее

sdelkaS=OrderSend(Symbol(),OP_SELL,1,Bid,2,

Ask+40*Point,Bid-30*Point,"My order #",12345,0,Green); } } } // Сделка

Одна проблема в этом же баре может открыться несколько раз, при совпадении всех условий. Может есть какая функция типа

при_совпадении_всех_условий_количество_выполнений_функции = 1 или выполнять_функцию_в_этом_баре = 1 или если_функция_прошла_в_этом_баре_её_новое_выполнение = false

Поискал на форуме нашёл один большой код, но какой-то он странно большой, если по-другому никак, то буду с ним разбираться.

 

в адресе https://www.mql5.com/ru/forum/131859 возьмите функцию

Функция ExistPositions() - ExistPositions - Возвращает флаг существования позиций

тогда:

 if (ExistPositions(NULL,-1,-1,0)==0) {//ЕСЛИ НЕТ ОТКРЫТЫХ ПОЗИЦИЙ - РАЗРЕШАЕМ ТОРГОВЛЮ

САМУ функцию https://www.mql5.com/ru/forum/131859 - расположить вне ф-и СТАРТ

Подойдет также ф-я https://www.mql5.com/ru/forum/131859/page3#434221 - NumberOfPositions - Возвращает количество позиций.

if ( NumberOfPositions(NULL,  -1,  -1)<1){ //если нет откр. позиций - открываем
 
Saintsid:

Одна проблема в этом же баре может открыться несколько раз, при совпадении всех условий. Может есть какая функция типа

при_совпадении_всех_условий_количество_выполнений_функции = 1 или выполнять_функцию_в_этом_баре = 1 или если_функция_прошла_в_этом_баре_её_новое_выполнение = false.

В том же адресе:

NumberOfBarCloseLastPos - Возвращает номер бара закрытия последней позиции или -1.
NumberOfBarOpenLastPos - Возвращает номер бара открытия последней позиции или -1.

(или https://www.mql5.com/ru/forum/102366 )

 

Уже почти закончил, осталось одно условие для полного счастья. Закрывать ордеры через ндцать секунд после открытия. А читая эти предложения типа "Эта массив-таймсерия возвращает исходное значение к проверяему выражению" меня начинает уже типать, не говоря уже о примерах, которые изобилуют непонятными функциями. Я понимаю, что наглею, простите старался как мог, придумал вот такой код для закрытия ордеров, но MT4 не понимает, поправьте или дайте ссылку на примерно такую же функцию

if(OrderSelect(0, SELECT_BY_POS, MODE_TRADES)==true){ // Выбрал 1-й открытый ордер

if(OrderOpenTime()+1000 == true) // Если после открытия ордера прошло Х секунд, то

OrderClose(OrderTicket(),1,Ask,3,Red); // Ордер закрыть

 

На страничке https://www.mql5.com/ru/forum/131859 попробуйте глянуть функции (стр.5)

TimeOpenLastPos - Возвращает время открытия последней открытой позиций.
SecondsAfterCloseLastPos - Возвращает количество секунд после закрытия последней позиций.
SecondsAfterOpenLastPos - Возвращает количество секунд после открытия последней позиций.

 
Saintsid:

Уже почти закончил, осталось одно условие для полного счастья. Закрывать ордеры через ндцать секунд после открытия. А читая эти предложения типа "Эта массив-таймсерия возвращает исходное значение к проверяему выражению" меня начинает уже типать, не говоря уже о примерах, которые изобилуют непонятными функциями. Я понимаю, что наглею, простите старался как мог, придумал вот такой код для закрытия ордеров, но MT4 не понимает, поправьте или дайте ссылку на примерно такую же функцию

if(OrderSelect(0, SELECT_BY_POS, MODE_TRADES)==true){ // Выбрал 1-й открытый ордер

if(OrderOpenTime()+1000 == true) // Если после открытия ордера прошло Х секунд, то

OrderClose(OrderTicket(),1,Ask,3,Red); // Ордер закрыть

if(OrderOpenTime()+1000 == true) // Если после открытия ордера прошло Х секунд, то
С true можно сравнивать только логические переменные типа bool.
Причина обращения: