View Full Version : Кому не сложно, помогите начинающему!
Только начал изучать язык mql4.. продвигаюсь потихоньку..
собственно в чем прецедент: очень нужен исходник уже готового советника, суть которого заключалась бы в следующем: любой(без разницы какой) индикатор в основе, например RSI(21) и уровнем 50.. при пробитии RSI показателя 55 снизу вверх, открывалась бы позиция на покупку и она бы висела без стопов и тейков до того момента, пока этот RSI не пробьет отметку в 45 сверху вниз! Очень важно, что-бы позы(ордера) не закрывались досрочно, а переворачивались на заданных точках RSI!
И еще такой вопрос, я хочу закинуть в советника измененный индикатор, не стандартный, как это сделать!?
заранее благодарен за ваше время!
Scriptong
03-05-2011, 09:43
Только начал изучать язык mql4.. продвигаюсь потихоньку..
собственно в чем прецедент: очень нужен исходник уже готового советника, суть которого заключалась бы в следующем: любой(без разницы какой) индикатор в основе, например RSI(21) и уровнем 50.. при пробитии RSI показателя 55 снизу вверх, открывалась бы позиция на покупку и она бы висела без стопов и тейков до того момента, пока этот RSI не пробьет отметку в 45 сверху вниз! Очень важно, что-бы позы(ордера) не закрывались досрочно, а переворачивались на заданных точках RSI!
Для реализации этого алгоритма идеально подходит Комплексный советник (http://www.forextrade.ru/mqlabs/20.10.2009-kompleksnyy-sovetnik-chast-1), но если вам нужен код, реализующий описанное без лишнего функционала, то посмотрите Три черных вороны и три бедых солдата (http://www.forextrade.ru/mqlabs/27.02.2011-mqlabs-tri-belyh-soldata-i-tri-chernyh-vorony). В этом коде достаточно подставить условие для вычисления значений RSI в функцию GetSignal.
И еще такой вопрос, я хочу закинуть в советника измененный индикатор, не стандартный, как это сделать!?
Пример приведен в статье Советник с самотестом (http://www.forextrade.ru/mqlabs/10.08.2009-sovetnik-s-samotestom-chast-1). Смотрите, опять же, функцию GetSignal.
Спасибо вам огромное, буду разбираться!
Убрал ненужные переменные, переписал GetSignal под необходимый индюк, описал условия открытия длинных и коротких поз! Убрал все, что связано со стоплоссом и тейкпрофитом! Начал компилировать... убрал все ошибки, но осталась только одна, не могу понять что не так!
текст ошибки:
'\end_of_program' - unbalanced left parenthesis C:\Program Files\Alpari MT4\experts\den002.mq4 (419, 1)
исходя из перевода я видимо упустил какую-то круглую скобку.. но как такое может быть... эта ошибка возникает после редактирования следующих строк данного( http://www.forextrade.ru/media/Image/MQLabs/103_ag/ThreeSoldiersMACDMA_Expert.mq4 ) экстперта
bool Trade()
{
// - 1 - == Сигнал открытия длинной сделки ==============================================
if (Signal > 0 && Type != OP_BUY) // Необходимо открыть длинную
{
if (Type == OP_SELL) // Если имеется короткая сделка, то..
if (!CloseDeal(Ticket)) // ..закроем ее. При неудаче вернем..
return(false); // ..ошибку
RefreshRates(); // Обновление значений Bid и Ask
double tp = NP(Ask + (Ask - SL)*TPtoSL); // Расчет уровня профита
if (OpenOrderCorrect(OP_BUY, Lots, NP(Ask), // Открытие позиции Buy
NP(SL), tp) != 0)
return(false);
}
// - 1 - == Окончание блока =============================================================
// - 2 - == Сигнал открытия короткой сделки =============================================
if (Signal < 0 && Type != OP_SELL) // Необходимо открыть короткую
{
if (Type == OP_BUY) // Если имеется длинная сделка, то..
if (!CloseDeal(Ticket)) // ..закроем ее. При неудаче вернем..
return(false); // ..ошибку
RefreshRates(); // Обновление значений Bid и Ask
tp = NP(Bid - (SL - Bid)*TPtoSL); // Расчет уровня профита
if (OpenOrderCorrect(OP_SELL, Lots, NP(Bid), // Открытие позиции Sell
NP(SL), tp) != 0)
return(false);
}
// - 2 - == Окончание блока =============================================================
я пытался убрать все связанное со стоплоссом и тейкпрофитом.. я выделю жирным те сторки, которые я удалял! Ну и в шапке соответственно я убрал данные переменные.. и вот после этого вылезает ошибка...
а если оставляю, то все хорошо... мне стоп и тейк не нужен... есть альтернатива конечно.. сделать их просто заоблачными (10000пп), это будет равносильно тому, что их нет! Но я не знаю, как это сделать!
Что-то я совсем запутался... в бай открывает, а в селл нет!
Уважаемый Скриптонг, не могли бы вы накидать этого советника!? У меня что-то совсем ничего не получается((( Суть проста.. никаких стопов и тейков... RSI(21) уровень 50: цена пробила 50 уровень RSI снизу-вверх,- открывается длинная позиция... и держится до тех пор, пока RSI снова не пробьет уровень 50, но только уже сверху-вниз.. позиция переворачивается(т.е: открытая позиция закрывается одновременно с открытием противоположной)...
и еще, очень важно, если цена пробивает 50 уровень, например, снизу-вверх - открылась длинная позиция, но в течении этого бара цена снижается показатель RSI опять опускается ниже 50 отметки, а позиция сразу-бы переворачивалась.. без разницы, сколько раз цена во время одного бара будет тереться туда-сюда.. поза должна каждый раз переворачиваться!
Scriptong
04-05-2011, 08:26
а если оставляю, то все хорошо... мне стоп и тейк не нужен... есть альтернатива конечно.. сделать их просто заоблачными (10000пп), это будет равносильно тому, что их нет! Но я не знаю, как это сделать!
Заметьте, что вы удаляете часть строки, в которой происходит открытие позиции. Там нужно не удалять часть строки, а вместо NP(SL), tp поставить нули (посмотрите объявление функции OpenOrderCorrect). В итоге функция должна выглядеть так:
bool Trade()
{
// - 1 - == Сигнал открытия длинной сделки ==============================================
if (Signal > 0 && Type != OP_BUY) // Необходимо открыть длинную
{
if (Type == OP_SELL) // Если имеется короткая сделка, то..
if (!CloseDeal(Ticket)) // ..закроем ее. При неудаче вернем..
return(false); // ..ошибку
RefreshRates(); // Обновление значений Bid и Ask
if (OpenOrderCorrect(OP_BUY, Lots, NP(Ask), // Открытие позиции Buy
0, 0) != 0)
return(false);
}
// - 1 - == Окончание блока =============================================================
// - 2 - == Сигнал открытия короткой сделки =============================================
if (Signal < 0 && Type != OP_SELL) // Необходимо открыть короткую
{
if (Type == OP_BUY) // Если имеется длинная сделка, то..
if (!CloseDeal(Ticket)) // ..закроем ее. При неудаче вернем..
return(false); // ..ошибку
RefreshRates(); // Обновление значений Bid и Ask
if (OpenOrderCorrect(OP_SELL, Lots, NP(Bid), // Открытие позиции Sell
0, 0) != 0)
return(false);
}
// - 2 - == Окончание блока =============================================================
return(True); // Все операции завершены успешно
}
Scriptong
04-05-2011, 08:36
и еще, очень важно, если цена пробивает 50 уровень, например, снизу-вверх - открылась длинная позиция, но в течении этого бара цена снижается показатель RSI опять опускается ниже 50 отметки, а позиция сразу-бы переворачивалась.. без разницы, сколько раз цена во время одного бара будет тереться туда-сюда.. поза должна каждый раз переворачиваться!
Для этого вам придется отключить контроль открытия нового бара, а в GetSignal отслеживать не пересечение уровня 50, а просто положение линии относительно уровня 50, всегда формируя сигнал покупки или продажи.
На мой взгляд такой подход к торговле ни к чему хорошему не приведет. Во-первых, чисто технический момент: цена может сколь угодно долго пребывать на одном и том же уровне (+/- 1 пункт), заставляя RSI с каждым тиком находиться по разные стороны от уровня 50. В итоге советник с каждым новым тиком будет открывать противоположные позиции, а вы - терять спрэд.
Во-вторых, проверка такого советника в тестере стратегий не будет адекватной (использование данных нулевого бара).
В-третьих, не каждый брокер потерпит совершение двух торговых операций на каждом новом тике.
Спасибо большое за помощь и советы! Буду думать и разбираться!
Уважаемый, Scriptong, сейчас провожу тесты своего советника, появилось несколько вопросов!
1 - Заход в позицию осуществляется по закрытию бара, т.е: необходимые условия для открытия позиции достигнуты, но советник все равно продолжает ждать пока не вырисуется новый бар! А нужно, чтобы он входил сразу по исполнению необходимых условий, не дожидаясь открытия нового бара! Искал в коде все связанное со словом "last", нашел только следующие строки:
datetime LastBar, LastSignal;
if(AccountFreeMarginCheck(Symbol(), OP_BUY, Lot) <= 0 || GetLastError() == 134)
int Error = GetLastError();
if (LastSignal != Time[0])
LastSignal = Time[0];
Но вроде ничто не указывает на то, чтобы показания применялись к цене закрытия...
2 - возможно ли реализовать то, что-бы в метатрейдере каждые 15 минут менялся профиль!?
Для этого вам придется отключить контроль открытия нового бара, а в GetSignal отслеживать не пересечение уровня 50, а просто положение линии относительно уровня 50, всегда формируя сигнал покупки или продажи.
Совсем забыл! Все сделал как вы сказали.. Но все-равно сделки выполняются только по закрытию бара!
Scriptong
10-05-2011, 14:40
1 - Заход в позицию осуществляется по закрытию бара, т.е: необходимые условия для открытия позиции достигнуты, но советник все равно продолжает ждать пока не вырисуется новый бар! А нужно, чтобы он входил сразу по исполнению необходимых условий, не дожидаясь открытия нового бара! Искал в коде все связанное со словом "last", нашел только следующие строки:
datetime LastBar, LastSignal;
if (LastSignal != Time[0])
LastSignal = Time[0];
Но вроде ничто не указывает на то, чтобы показания применялись к цене закрытия...
Переменная LastBar отвечает за общее функционирование советника в пределах одной свечи, а LastSignal следит только за тем, чтобы на одном и том же баре не производился повторный расчет сигнала. То есть их обе нужно отключить. Второй момент - нужно проследить за тем, чтобы значение RSI снималось с нулевого бара, а не с первого.
2 - возможно ли реализовать то, что-бы в метатрейдере каждые 15 минут менялся профиль!?
Средствами MQL4 - нет. При помощи API-функций - да (программная эмуляция нажатия одной из кнопок МТ4). На сайте MetaQuotes одно время даже существовала целая ветка по нахождению кодов различных кнопок МТ4. Но этот путь не является стабильным, т.к. в очередном билде терминала многое может измениться и тогда поиск придется начинать сначала.
Powered by vBulletin® Version 4.1.8 Copyright © 2012 vBulletin Solutions, Inc. All rights reserved.