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

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

#2126

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

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


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

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


Да, я не программист. Только учусь.
Цены бывают что совпадают, причем один в один (на 4-х знаке).
самое главное чтобы хаи были равны, и не важно что они будут не максимальные.
#2128
Crik1978 самый простой вариант (чтоб не делать вложенный цикл): записать 10 значений в массив и отсортировать (в любом направлении) потом в цикле проверять 2 соседних значения. Набросайте черновик кода, а я подправлю (если что).
#2129


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


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

Experts_TMA_middle.ex45 скач.
Experts_TMA_middle.mq410 скач.

#2130


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



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

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

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


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

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


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

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



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



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


и по количеству баров, если не 10 а 80......

Изменено 21 апреля, 2015 пользователем Crik1978

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

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

Изменено 21 апреля, 2015 пользователем 0ll

#2134


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

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



Спасибо.
а по сортировке, где можно почитать?
#2135

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

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

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

Изменено 22 апреля, 2015 пользователем chistaia-rodina

#2137

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

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

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

Изменено 23 апреля, 2015 пользователем master.man

#2140
master.man нет. всё значительно сложнее. Самый простой вариант - в индикатор РСИ встроить сглаживание.
#2141
chistaia-rodina, Спасибо что посмотрели. Да я что-то не подумал про большие свечи. Буду побывать дальше)
#2142


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


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

Изменено 25 апреля, 2015 пользователем Monroff

#2143

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

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

Вот код:


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);


}

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

если СЛ > 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;
}



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

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

Вот рабочий код переводит стоп в БУ +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);
}

}

}
}
}
}

#2147

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

#2148

Мы-же здесь учимся кодировать... Я думаю если человеку нужен готовый код, то в гугле сразу найдёт.
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()

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

#2149


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



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

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


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



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

Изменено 29 апреля, 2015 пользователем nct21

#2150

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

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

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

Да там косяк. Для Селл вместо
if (OrderStopLoss() > OrderOpenPrice()) return; надо if (OrderStopLoss() OrderOpenPrice()) return;

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

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