Обучение языку MQL4 под MetaTrader 4📌

От xbms, 13 апреля, 2013 в Уголок Программиста

#2251


Как установить индикатор HMA Color на часовой график, но при этом данные чтобы брались с 4-х часового графика?

Не знаю на чём индюк построен, но если на МА, то надо просто в 4 раза период увеличить и всё.


Индюк построен на основе МА. Период МА изменен с текущего графика на 4-х часовой. Количество баров в индикаторе рассчитывается на текущем графике. Как сделать, чтобы количество баров рассчитывались с 4-ч часового графика?
во вложении индюк

HMA_Color_4часа.mq48 скач.

#2252
bzs в начале ф-ции трейлинга ставь: Print("Tral time = ", TimeToStr(TimeCurrent());

Crik1978 настраиваешь период индюка на Н4, например будет HMA_Period=32, переходишь на Н1 и в индюке меняешь HMA_Period=32*4=128. на этом всё - должно получиться.
#2253

Проверьте пойдет такой вариант ?

трал_2.txt9 скач.

#2254

Проверьте пойдет такой вариант ?

Dron15 так лучше, но ещё есть ошибки.
1. Вычисляйте чистую цену БУ, без нормализации и трала. Вот почему здесь +? (ведь для бая и селл должно быть разное значение):
avgprice = NormalizeDouble(price/ order_lots + TrailingStop*Point, Digits);

2. Зачем Вы везде вставляете NormalizeDouble? - это абсолютно лишнее. Необходимость в этом есть только при передаче значения в функцию работы с ордерами.

3. Ф-ция OrderModify возвращает true при успешном выполнении, а у Вас наоборот?
#2255

0ll не ругайся сильно потихоньку разберусь, а идея такая лос ставится только после того как цена достигнет средней цены + профит который я хочу получить и если цена ударила в лос то закрываем всю сеть , а если цена пошла дальше тралим. Нащет OrderModify щас посмотрю еще разок. Примеров просто мало правильных, приходиться додумывать и по сайтам смотреть кто как пишет , но все равно что то начинает проясняться. Еще не получается подципить трал в функцию старт , но давай с тралом разберемся а потом пойдем дальше.

#2256

Доброго времени суток,

Подскажите пожалуйста, как можно заставить советника работать с текстовым файлом (*.txt) в котором будет храниться история новостей...

#2257

Вот это посмотри.

переделал_2.txt7 скач.

#2258

Доброго времени суток.
Не знаю, правильно ли выбрал тему для своего вопроса, если нет - прошу извинить и ткнуть носом в подходящую.
А вопрос в следующем: попался мне советник, который я захотел чуток доработать в целях самообразования и изучения языка MQL - упорядочить описание вводных, манименеджмент прикрутить, научить открытые позиции после включения подхватывать. Вот когда пытался понять как реализовать последнее, наткнулся на такой блок в коде:

Спойлер


for (i=0;i {
if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderMagicNumber()==magic_num &&
OrderSymbol()==Symbol() &&
OrderProfit() OrderCloseTime()>=iTime(NULL,PERIOD_D1,0) ) minus++;
}
}
for (i=0;i {
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderMagicNumber()==magic_num && OrderSymbol()==Symbol()) pos = OrderTicket();
}
}



Так вот, правильно ли я понимаю, что этот кусок кода и есть то самое искомое подхватывание и дальнейшее сопровождение открытых позиций советником?
Заранее спасибо за ответ и\или совет(ы).
#2259


Доброго времени суток.
Не знаю, правильно ли выбрал тему для своего вопроса, если нет - прошу извинить и ткнуть носом в подходящую.
А вопрос в следующем: попался мне советник, который я захотел чуток доработать в целях самообразования и изучения языка MQL - упорядочить описание вводных, манименеджмент прикрутить, научить открытые позиции после включения подхватывать. Вот когда пытался понять как реализовать последнее, наткнулся на такой блок в коде:

Спойлер


for (i=0;i {
if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderMagicNumber()==magic_num &&
OrderSymbol()==Symbol() &&
OrderProfit() OrderCloseTime()>=iTime(NULL,PERIOD_D1,0) ) minus++;
}
}
for (i=0;i {
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderMagicNumber()==magic_num && OrderSymbol()==Symbol()) pos = OrderTicket();
}
}



Так вот, правильно ли я понимаю, что этот кусок кода и есть то самое искомое подхватывание и дальнейшее сопровождение открытых позиций советником?
Заранее спасибо за ответ и\или совет(ы).


Нет это скорее Мартингейл (увеличение следующей позиции если предыдущая была убыточной).
#2260


Нет это скорее Мартингейл (увеличение следующей позиции если предыдущая была убыточной).



В тестере советник не увеличивал лот при минусовой сделке, да и в настройках множитель мартина не предусмотрен. Так что вопрос пока остается...

И появился еще такой вопрос: возможно ли написать сову, которая будет работать со свечами Heiken Ashi, учитывая наличие\отсутствие хвостов у свечей и их величину, а также фильтровать по показаниям индюков, не входящих в стандартный набор MT4?

Изменено 18 июня, 2015 пользователем holodar

#2261
holodar по приведённому Вами коду нельзя сказать что это "и есть то самое искомое подхватывание"
В разных совах по разному... в своих я считаю количество ордеров, обновляю тикеты, обновляю уровни стопов. В вашем коде этого нет, но и не понятно что советнику требуется для нормальной работы после инициализации.
По поводу вопроса о возможности написать сову - Да, возможно.

tekashnik по работе с текстовыми файлами читайте справку раздел "Файловые операции". Читать, писать, создавать - всё, что угодно.

Dron15 прогресс в Вашей работе присутствует.
Ошибка в Этой конструкции (и подобной для Селл):
if(Bid - OrderOpenPrice() >= SL && SL != OrderStopLoss ()) SL = NormalizeDouble(avgprice + TrailingStop * Point, Digits);
1. при первом запуске чему равен SL ?
2. Bid - OrderOpenPrice() = (например) 0.002, а SL ? КАК это условие выполнится ? Скорее всего здесь нужен не SL, а TrailingStop...
3. Это условие начала работы трала, а где условие переноса трала ? Нужна ещё проверка: если дистанция от цены до СЛ > трал + шаг трала, то переносим стоп на дистанцию цена +- трал.
4. avgprice + TrailingStop * Point - не изменится со временем, пока новый ордер не откроете. Вместо avgprice надо использовать текущую цену. и для Бая нужно не +, а -
5. текущий уровень стопа считайте сразу, в блоке модификации ничего не досчитывайте, кстати там тоже ошибка.
#2262

holodar это точно не подхватывание так-как считаются уже закрытые ордера.Среди которых ищутся убыточные.Да ещё и считаются!

#2263


holodar это точно не подхватывание так-как считаются уже закрытые ордера.Среди которых ищутся убыточные.Да ещё и считаются!



Интересно, конечно, зачем ему это...
Спасибо всем за ответы. Теперь буду пробовать свои силы в написании функции подхватывания ордеров по Магику и Символу. Надеюсь, это возможно реализовать.
#2264

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

holodar суть "подхватывания" : нужно просто заполнить значениями глобальные переменные, используемые в советнике, иногда достаточно из Инита() запустить имеющуюся ф-цию пересчёта ордеров и всё. Удачи.
#2265

0ll за листочек спасибо , помогает ) я думаю вы поняли о чем я. Исправил код по новому проверь пожалуйста.
Единственное что мне кажется надо Bid и Ask поменять местами , но может я и ошибаюсь.

исправил.txt5 скач.

#2266
Dron15 ошибка здесь:
if(OrderStopLoss() == (OrderOpenPrice() + NormalizeDouble(Bid - TrailingStop*Point,Digits )))
if(Bid - OrderStopLoss() 1. " == " работать не будет - цена изменится на 2 пипс и условие не сработает. Нужно неравенство.
2. здесь нужно отследить изменение цены на стоп+шаг. это делается проще (для Бая):
if (OrderStopLoss() > Bid - (TrailingStop + TrailingStep)*_Point)
{ //то переносим на уровень
SL = Bid - TrailingStop*_Point;
OrderModify(...
3. Это - if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic лучше делать непосредственно после for

Это всё - после этих исправлений будет (должно) работать... ;)
#2267

1. " == " работать не будет - цена изменится на 2 пипс и условие не сработает. Нужно неравенство.
тут видел что что то нетак , компилятор показывал но получилось что неразобрался.
2. здесь нужно отследить изменение цены на стоп+шаг. это делается проще (для Бая):
if (OrderStopLoss() > Bid - (TrailingStop + TrailingStep)*_Point)
тут хотел так написать но что то за сомневался.
3. Это - if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic лучше делать непосредственно после for
тут убрал перешет , раз сделал OrderModify(... для каждого типа , а получается он нужен ?

Щас немного освобожусь переделаю.


Добавлено: 20-06-2015 12:20:34

Вот вроде все подправил.

исправил.txt5 скач.

Изменено 20 июня, 2015 пользователем Dron15

#2268
Dron15 некоторые вещи, которые кажутся мне естественными, Вы не понимаете...
1. Вы используете функциии OrderStopLoss() и другие вне цикла перебора ордеров ! Значения, возвращаемые этими функциями могут быть любыми, в том числе от закрытых ордеров или вообще 0. Короче - сначала цикл, потом всё остальное.
2. Чему равно это неравенство: OrderStopLoss() > Bid - OrderStopLoss() + TrailingStep*Point ?
я отвечу оно равно true по-любому. в любое время... а почему, знаете ?
3. И это, то-же самое: OrderStopLoss() != (OrderOpenPrice() + NormalizeDouble(Bid - TrailingStop*Point,Digits ))

Подсказка:
for(int i = OrdersTotal()-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(!(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)) continue;
if (OrderType() != otype) continue;
if (OrderType() == OP_BUY)
{
if(OrderOpenPrice()>= Bid - TrailingStop || OrderStopLoss () == 0 )
{
if (OrderStopLoss() > Bid - (TrailingStop + TrailingStep)*_Point)
{
SL = Bid - TrailingStop*_Point;
OrderModify(...
}
}
}
Вот такая структура, только селл добавить...
#2269


Dron15 некоторые вещи, которые кажутся мне естественными, Вы не понимаете...
1. Вы используете функциии OrderStopLoss() и другие вне цикла перебора ордеров ! Значения, возвращаемые этими функциями могут быть любыми, в том числе от закрытых ордеров или вообще 0. Короче - сначала цикл, потом всё остальное.
2. Чему равно это неравенство: OrderStopLoss() > Bid - OrderStopLoss() + TrailingStep*Point ?
я отвечу оно равно true по-любому. в любое время... а почему, знаете ?
3. И это, то-же самое: OrderStopLoss() != (OrderOpenPrice() + NormalizeDouble(Bid - TrailingStop*Point,Digits ))

Подсказка:
for(int i = OrdersTotal()-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(!(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)) continue;
if (OrderType() != otype) continue;
if (OrderType() == OP_BUY)
{
if(OrderOpenPrice()>= Bid - TrailingStop || OrderStopLoss () == 0 )
{
if (OrderStopLoss() > Bid - (TrailingStop + TrailingStep)*_Point)
{
SL = Bid - TrailingStop*_Point;
OrderModify(...
}
}
}
Вот такая структура, только селл добавить...



И куда Вы с этим трейлингстопом придёте ,хотелось бы мне узнать?!
У Вас-же тут одни ОШИБКИ!!!
Вот с этим Вы дойдёте только до цены открытия if(OrderOpenPrice()>= Bid - TrailingStop || OrderStopLoss () == 0 ).
А вот с этим if (OrderStopLoss() > Bid - (TrailingStop + TrailingStep)*_Point) вообще только один раз дёрнитесь!!!

Изменено 21 июня, 2015 пользователем Konstebl

#2270


И куда Вы с этим трейлингстопом придёте ,хотелось бы мне узнать?!
У Вас-же тут одни ОШИБКИ!!!
Вот с этим Вы дойдёте только до цены открытия if(OrderOpenPrice()>= Bid - TrailingStop || OrderStopLoss () == 0 ).
А вот с этим if (OrderStopLoss() > Bid - (TrailingStop + TrailingStep)*_Point) вообще только один раз дёрнитесь!!!

Друг Konstebl - меньше эмоций, спасибо за внимательность, но можно было и указать ошибку.
Dron15 надо не >, a = Bid - TrailingStop , надо для Бая OrderOpenPrice() Bid - TrailingStop*_Point
и OrderStopLoss() Bid - (TrailingStop + TrailingStep)*_Point
#2271

Согласен!Исправлюсь!

#2272

Не дали мне написать ответ для Oll . Только сел за комп и уже куча ответов. Я это к то му что у меня стаж в програмировании только первый месяц . Думаю что и вы не постигли все азы програмирования за месяц. Ну да ладно не это важно. За подсказку спасибо. Исправил на вотето

if(OrderStopLoss() != (OrderOpenPrice() + NormalizeDouble(Bid - TrailingStop*Point,Digits , мне это понятнее .
OrderStopLoss() > Bid - (TrailingStop + TrailingStep)*_Point а вот тут хотел спросить как может стоп лос быть больше цены он же вроде только по профиту работает. Сижу и думаю но не может быть так .

if(OrderOpenPrice()>= Bid - TrailingStop вот тут спасибо что то не подумал что стоп не надо равнять с ценой открытия и цена Bid должна быть больше щас сяду исправлять.

#2273


Не дали мне написать ответ для Oll . Только сел за комп и уже куча ответов. Я это к то му что у меня стаж в програмировании только первый месяц . Думаю что и вы не постигли все азы програмирования за месяц. Ну да ладно не это важно. За подсказку спасибо. Исправил на вотето

if(OrderStopLoss() != (OrderOpenPrice() + NormalizeDouble(Bid - TrailingStop*Point,Digits , мне это понятнее .
OrderStopLoss() > Bid - (TrailingStop + TrailingStep)*_Point а вот тут хотел спросить как может стоп лос быть больше цены он же вроде только по профиту работает. Сижу и думаю но не может быть так .

if(OrderOpenPrice()>= Bid - TrailingStop вот тут спасибо что то не подумал что стоп не надо равнять с ценой открытия и цена Bid должна быть больше щас сяду исправлять.


if(OrderStopLoss() !=(OrderOpenPrice() + NormalizeDouble(Bid - TrailingStop*Point,Digits)))
Лучше написать не !=,потому-что стоплосс будет ходить за ценой вверх и вниз,а просто ,,что-бы
вниз не опускался.
#2274

Посмотрите уважаемые сенсеи что я там на поправлял . Функция начала оживать. Думаю теперь дело дошло до функции старт, если все нормально поправил. В тестере открывается 2 ордера и общий стоп и все , закрывается по стопу все ордера , но стоп не модифицируется он выставляется ниже 2 ордера как я понимаю по TrailingStop. И еще просьба вот такие вещи (Лучше написать не !=,потому-что стоплосс будет ходить за ценой вверх и вниз,а просто ,вниз не опускался.) говорите потому что они только с опытом приходят а я допустим и другие учащиеся не имеющие сразу возможности сов проверить в тестере поймут это только когда будет возможность увидеть работу советника в тестере. Спасибо за помощ.

переделал_2.txt8 скач.

#2275
Dron15 у Вас не работает из-за этой строчки:
if(OrderStopLoss() честно говоря уже пальцы болят одно и то-же писать, то -ли Вы не внимательны, то-ли ищите что-то... :-?

Для публикации сообщений создайте учётную запись или авторизуйтесь

Перейти к списку тем
Форум · 2.0.20260627.0025