Перейти к содержанию

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


Рекомендуемые сообщения

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

Нужна помощь в определении двух одинаковых значений High на протяжении 10 баров.

Всё-таки Вы не программист... у программистов должны возникать вопросы достаточности условий:
1. цены редко совпадают с точностью до 5 знака - допуск даёте?
2. нашли 2 одинаковых хая, но они не максимальные - Вам подойдёт?
Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано


Нужна помощь в определении двух одинаковых значений High на протяжении 10 баров.

Всё-таки Вы не программист... у программистов должны возникать вопросы достаточности условий:
1. цены редко совпадают с точностью до 5 знака - допуск даёте?
2. нашли 2 одинаковых хая, но они не максимальные - Вам подойдёт?


Да, я не программист. Только учусь.
Цены бывают что совпадают, причем один в один (на 4-х знаке).
самое главное чтобы хаи были равны, и не важно что они будут не максимальные.
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Crik1978 самый простой вариант (чтоб не делать вложенный цикл): записать 10 значений в массив и отсортировать (в любом направлении) потом в цикле проверять 2 соседних значения. Набросайте черновик кода, а я подправлю (если что).
Ссылка на сообщение
Поделиться на другие сайты

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


sanyasan, тогда надо бы последнюю вашу версию посмотреть полностью.


Посмотрите пожалуйста.

Experts_TMA_middle.ex4
Experts_TMA_middle.mq4

Ссылка на сообщение
Поделиться на другие сайты

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


Crik1978 самый простой вариант (чтоб не делать вложенный цикл): записать 10 значений в массив и отсортировать (в любом направлении) потом в цикле проверять 2 соседних значения. Набросайте черновик кода, а я подправлю (если что).



а если сравнивать не только соседние, а например первый и последний
Ссылка на сообщение
Поделиться на другие сайты

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

а если сравнивать не только соседние, а например первый и последний

После сортировки первый и последний будут с наибольшей разницей (мин и мах).
Вы знаете что такое сортировка?
Ссылка на сообщение
Поделиться на другие сайты

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


а если сравнивать не только соседние, а например первый и последний

После сортировки первый и последний будут с наибольшей разницей (мин и мах).
Вы знаете что такое сортировка?


:-) нет, не знаю

Добавлено: 21-04-2015 13:05:33



Crik1978 самый простой вариант (чтоб не делать вложенный цикл): записать 10 значений в массив и отсортировать (в любом направлении) потом в цикле проверять 2 соседних значения. Набросайте черновик кода, а я подправлю (если что).



а если сравнивать не только соседние, а например первый и последний


и по количеству баров, если не 10 а 80...... Изменено пользователем Crik1978
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Crik1978 если не знаете что такое сортировка, то делайте через вложенные циклы:

bar_count = 80;
for (i=1; i {
for (j=i+1; j {
if (High[ i ] == High[j])
{
... //Здесь Ваш код - нашли одинаковые хаи. Продумайте вариант если одинаковых хаев будет несколько пар
break; // используйте это для прекращения поиска если достаточно 1 пары
}
}
} Изменено пользователем 0ll
Ссылка на сообщение
Поделиться на другие сайты

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


Crik1978 если не знаете что такое сортировка, то делайте через вложенные циклы:

bar_count = 80;
for (i=1; i {
for (j=i+1; j {
if (High == High[j])
{
... //Здесь Ваш код - нашли одинаковые хаи. Продумайте вариант если одинаковых хаев будет несколько пар
break; // используйте это для прекращения поиска если достаточно 1 пары
}
}
}



Спасибо.
а по сортировке, где можно почитать?
Ссылка на сообщение
Поделиться на другие сайты

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

а по сортировке, где можно почитать?

Сортировка массива читать здесь. Что такое сортировка вообще - гугл.
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
sanyasan, посмотрел, с кодом всё в порядке и отрабатывает он без глюков, а именно так как и задумано. Проблема в другом, по вашему скрину особенно хорошо это видно, если свеча, после закрытой за каналом, такого большого размера и находится над нижним краем канала, то всё это время условие для открытия сделки сохраняется, поэтому она будет без конца открываться, собирая стопы и профиты, пока не переключится на следующую. Аналогично и зеркально для противоположного направления. Кстати, надо было используемый индикатор тоже приложить, у меня его нет, но я просто прописал другой канал, так что не важно, принцип тот же.

Если нужно открытие по одной сделке за одно совпадение условия, то предлагаю ввести булевую переменную. К примеру, если цена закрытия за каналом, то (true), а как только сделка открылась, переводить в (false) и перед открытием проверка, в каком она положении. Изменено пользователем chistaia-rodina
Ссылка на сообщение
Поделиться на другие сайты

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

Добрый день, уважаемые програмисты! Есть хорошая идея по доведению до ума Совы с форума. Думаю для вас это абсолютно несложно..
Подскажите что куда надо прописать, чтоб просто сделки не открывались в зоне 100 или -100 по индикатору CCI?..
Есть пара сов, с работой этих индикаторов, если что могу приложить, чтоб оттуда выдернуть.. Это будет чудоСова если поможете! Оттестирую на реале и выложу на форум если будет интересно людям!
Заранее благодарен!!

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Monroff, если так, то нужно сразу и прикладывать, а там видно будет, кого заинтересует тот посмотрит и что-то сделает или подскажет.
Ссылка на сообщение
Поделиться на другие сайты

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

Доброго времени суток уважаемые! Столкнулся с такой трудностью... Имея чистый график и прикрепляя к нему индикатор RSI, он встает в подвале. Затем если взять с навигатора индикатор МА и бросить его на RSI (в настройках МА указать применить к previous indicator,s data) то он будет сглаживать RSI. А как это прописать в коде? Я так понимаю, надо в applied_price у iMA указать индикатор RSI? в справке по этому поводу ничего не нашел...

Изменено пользователем master.man
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
master.man нет. всё значительно сложнее. Самый простой вариант - в индикатор РСИ встроить сглаживание.
Ссылка на сообщение
Поделиться на другие сайты

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


Monroff, если так, то нужно сразу и прикладывать, а там видно будет, кого заинтересует тот посмотрит и что-то сделает или подскажет.


да просто там пара строк то всего добавляться должна, нормальный програмист бы понял..
тут Сапфир уже помог.. Вопрос снят. Изменено пользователем Monroff
Ссылка на сообщение
Поделиться на другие сайты

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

Я уже голову сломал, выручайте братцы-программисты!

Пытаюсь перевести текущий ордер на продажу в безубыток, тралить не надо.

Вот код:


if (ticket>0)
{
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
{
if (OrderOpenPrice() == NormalizeDouble(Ask + StopLoss*Point, Digits))

SL = NormalizeDouble(Ask - TralingStep*Point, Digits);
else
SL = NormalizeDouble(Ask + StopLoss*Point, Digits);

}
TP = NormalizeDouble(Ask - TakeProfit * Point, Digits);

bool modify = OrderModify(ticket, OrderOpenPrice(), SL, TP, Blue);


}

В таком виде советник меняет стоплос и тейкпрофит с каждым тиком, а мне нужно один раз выставить СЛ и ТП, а потом один раз перевести ордер в безубыток и все!
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
nct21 просто надо перенести СЛ на цену открытия + спред + вишенка. В момент когда цена оказалась дальше некой дистанции. Итак для бая:
если СЛ > OrderOpen - выход (значит уже в безубытке)
иначе
если Бид > OrderOpen + Дистанция - { здесь расчёт СЛ = OrderOpen + Спред, и ОрдерМодифи }
иначе - выход
Ссылка на сообщение
Поделиться на другие сайты

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

если СЛ > OrderOpen - выход (значит уже в безубытке)
иначе
если Бид > OrderOpen + Дистанция - { здесь расчёт СЛ = OrderOpen + Спред, и ОрдерМодифи }
иначе - выход

Я сделал для СЕЛЛ:


if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
{
if (StopLoss*Point > OrderOpenPrice()) return;

else

if (NormalizeDouble(Ask > OrderOpenPrice() + TralingStop*Point, Digits))
{
SL = NormalizeDouble(OrderOpenPrice() + TralingStep*Point, Digits);
bool modify = OrderModify(ticket, OrderOpenPrice(), SL, TP, Blue);
}
else

return;

//TP = NormalizeDouble(Ask - TakeProfit * Point, Digits);


return;
}



Ошибок в журнале нет, СТОП теперь не выставляется вообще!
Ссылка на сообщение
Поделиться на другие сайты

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

Да уж наворотил так как

Вот рабочий код переводит стоп в БУ +2 если Buy или -2 пункта если Sell. Только смотри чтобы с другими модификациями ордеров в конфликт не входил

//перевод ордера в без убыток
void NoLoss()
{
for(int i=0; i {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==OP_BUY)
{
if(Bid>OrderOpenPrice()+(OrderOpenPrice()-OrderStopLoss())*MultiplierNoloss)
{
SL=OrderOpenPrice()+2*Point;
OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0,0);
}
}
if(OrderType()==OP_SELL)
{
if(Ask {
SL=OrderOpenPrice()-2*Point;
OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0,0);
}

}

}
}
}
}

Ссылка на сообщение
Поделиться на другие сайты

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

Парни, прежде чем лепить своё, изучайте лучшие чужие коды.
Например, http://www.kimiv.ru/
Там есть перевод в БУ, которым лет 7-8 пользуются тысячи людей.
Там еще и тьма бесплатного софта в открытом коде.

Ссылка на сообщение
Поделиться на другие сайты

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

Мы-же здесь учимся кодировать... Я думаю если человеку нужен готовый код, то в гугле сразу найдёт.
nct21
1. Замените здесь if (StopLoss*Point > OrderOpenPrice()) return; на if (OrderStopLoss() > OrderOpenPrice()) return;
2. Здесь if (NormalizeDouble(Ask > OrderOpenPrice() + TralingStop*Point, Digits)) - if (Ask > OrderOpenPrice() - TralingStop*Point) - зачем NormalizeDouble? и для Селл нужен (-), т.к. расчёт идёт не от текущей цены, а от цены открытия или у Вас другие планы? далее в расчёте SL - то-же.
3. При модификации SL ордера? TP лучше задавать OrderTakeProfit()

исправьте и должно работать.

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


Да уж наворотил так как



а что такое "MultiplierNoloss"?

Добавлено: 29-04-2015 17:54:37


Мы-же здесь учимся кодировать...



исправил. Теперь работает, но не переводит в безубыток, а как-будто тралит, все время СЛ передвигается! Почему не пойму. Изменено пользователем nct21
Ссылка на сообщение
Поделиться на другие сайты

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

а что такое "MultiplierNoloss"?

Это множитель. Проще говоря Дистанция = СЛ * MultiplierNoloss. Чем дальше стоп тем больше должна пройти цена для БУ.

исправил. Теперь работает, но не переводит в безубыток, а как-будто тралит, все время СЛ передвигается! Почему не пойму.

Да там косяк. Для Селл вместо
if (OrderStopLoss() > OrderOpenPrice()) return; надо if (OrderStopLoss() OrderOpenPrice()) return;
Ссылка на сообщение
Поделиться на другие сайты

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

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...