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

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

#4726

как мы можем всунуть shift в bool переменную????Я такого ни где не видел, и мы ее уже объявляли??

это-ж не переменная, а функция и в её параметры можете передавать что хотите, например:
bool если_больше ( int число1, int число2 ) { return ( число1 > число2 ); }

не знаю насчёт объявления shift... Но если смещение стабильно, то выведи его во внешние настройки:
extern int shift = 3;
#4727

ок про функции вообще огромный респект)
А вот про extern int shift = 3; я уже пробовал
//возвращает данные DN буфера
double Reds(shift) { return( iCustom(NULL, 0, "Slope Direction Line", period, method, price, 1, shift) ); }
//возвращает данные UP буфера
double Greens(shift) { return( iCustom(NULL, 0, "Slope Direction Line", period, method, price, 0, shift) ); }

bool SellSignal(shift)
{return(Reds(shift) > 0 && Reds(shift)0 && Greens(shift+1)
bool BuySignal(shift)
{return(Greens(shift)>0 && Greens(shift)0 && Reds(shift+1)
Выдает ошибки : 'shift' - declaration without type
'SellSignal' - wrong parameters count
Что то в гугле так и не нашел как их исправить?




Добавлено: 25-07-2017 08:23:37

Может shift надо привести в нормальный вид, но это просто сдвиг, что в нем не так то?

Изменено 25 июля, 2017 пользователем d1w4m3

#4728

Изучила весь курс программирования MQL4. Сделала почти все задания.
Уникальный материал, больше такого в сети не попадалось. Пишу простенькие совы.
Очень мало информации по индикаторам. Подскажите в общих чертах:

1. Как перекрашивать бары в другой цвет?
2. Как рисовать прямоугольники?
3. Как над баром вывести текстовую информацию, например цену открытия.

#4729
d1w4m3 при объявлении функции надо писать тип параметра, а при вызове - просто переменную, например:
double Reds( int sh ) { ... }, при вызове можно Reds( shift ) или
потом:
bool SellSignal( sh )
{return(Reds( sh ) > ... }

Nicole White цвет в индикаторах МТ4 делается с помощью разных буферов. Один буфер красный, другой жёлтый, нужный момент красный обнуляется, а жёлтый продолжает линию и наоборот.
Так-же есть несколько типов графических объектов, в том числе прямоугольники и лейблы для отображения текста. Я не спец в графике - может кто-то развёрнуто подскажет.

Изменено 25 июля, 2017 пользователем 0ll

#4730

Подскажите, пожалуйста, как написать условие. Есть два стрелочных индикатора. Так вот, когда один подает сигнал, то по второму входить можно только в течение 10-ти баров.

#4731


Подскажите, пожалуйста, как написать условие. Есть два стрелочных индикатора. Так вот, когда один подает сигнал, то по второму входить можно только в течение 10-ти баров.

Логика такая: Появился сигнал инд.1 - присваиваем счётчику i=10, далее на каждом баре вычитаем i--. Далее если при i> 0 появляется сигнал инд.2 - вход, если снова инд.1 - обновляем счётчик.
#4732

Утро доброе)
Работает, но опять открывает и бай и селл)
double Reds(int sh)
{double buf = iCustom(NULL, 0, "Slope Direction Line", period, method, price, 1,shift); return(buf);}
double Greens(int sh)
{double buf = iCustom(NULL, 0, "Slope Direction Line", period, method, price, 0, shift); return(buf);}
bool SellSignal()
{return(Reds(shift) > 0 && Reds(shift)0 && Greens(shift+1)bool BuySignal()
{return(Greens(shift)>0 && Greens(shift)0 && Reds(shift+1)

#4733
d1w4m3 так это-ж хорошо! :d
В Reds(int sh) вроде должен sh использовать, а пишешь shift
в сигнальных параметра нет, но shift используешь - он глобальный и не меняется?
#4734

================Вопрос К Программистам==========

Скажите реально ли сделать такую примочку - собрать историю изменения спреда в течении суток в реальном времени за период, например 1 месяц, сохранить ее в файл, определить среднее значения по всем дням и часам, затем прикрутить ее к советнику, чтобы он брал эту историю спреда из файла и основывался на ней при оптимизиции, а в тестере MT4 выставить значение 0?

#4735

))))как вы говорите, если сделать, то я логически просто не могу прочитать что мы тут делаем)
extern int shift = 3;
double Reds(int sh)
{double buf = iCustom(NULL, 0, "Slope Direction Line", period, method, price, 1,shift); return(buf);}
double Greens(int sh)
{double buf = iCustom(NULL, 0, "Slope Direction Line", period, method, price, 0, shift); return(buf);}
bool SellSignal(sh)
{return(Reds(sh) > 0 && Reds(sh)0 && Greens(sh+1)bool BuySignal(sh)
{return(Greens(sh)>0 && Greens(sh)0 && Reds(sh+1)Выдает 'sh' - declaration without type
'SellSignal' - wrong parameters count
'BuySignal' - wrong parameters count Честно вообще понятия не имею что это и с чем его есть))



#4736

не напрягайся...
когда передаёшь параметр в функцию он должен иметь размер, чтоб система выделила под него память. Вызов SellSignal(sh) - параметр без размера, нужно добавить int.
Здесь правильный вызов Reds(int sh), но параметр не применяется внутри функции - там остался shift, это не критично. т.к. shift - глобальная переменная. но это может создать хаос в случае дальнейшей модификации программы.
ПС: это не избавит от открытия и бай и селл, нужно ставить принты и смотреть как отрабатывают условия, например:
double Reds(int sh)
{double buf = iCustom(NULL, 0, "Slope Direction Line", period, method, price, 1,sh); Print("

#4737

имхо реально, но в советнике придётся увеличивать дистанции при открытии/закрытии ордеров на величину спреда.

#4738

Спасибо буду трудиться дальше ^:)^ :d

#4739


имхо реально, но в советнике придётся увеличивать дистанции при открытии/закрытии ордеров на величину спреда.



Насколько в таком случае будут объективны результаты оценки ТС? Насколько я знаю имитировать плавающий спред может программа TDS, но там не учитывается фактор времени, то есть TDS повышает и понижает спред с заданным шагом и делает это хоатично, при этом не учитываются торговые часы, время выхода новостей, торговые сессии, ролловер и т.д, что может исказить реальные результаты, а если собрать историю изменения спреда по дням недели и часам самому на длинном участке времени, скажем несколько месяцев и определить среднее значение, то результаты оценки ТС с учетом спреда были бы более объективны так как спред в большинстве случаев начинает скакать в одно и то же время, примерно в одинаковом диапазоне, и по одним и тем же причинам или я не прав?
#4740
izeran6565, TDS2 сохраняет и использует реальные спрэды тех же дукасов, разные в разное время - никакого хаоса.
С реальными спрэдами, насколько слышал, и часть котировок Альпари.
Есть тьма статей на тему как тестировать с реальными спрэдами.
Имхо, вместо адекватных тестов вы выдумываете никому не нужные костыли.
#4741

Разобрался

Изменено 28 июля, 2017 пользователем Сахалинец

#4742


izeran6565, TDS2 сохраняет и использует реальные спрэды тех же дукасов, разные в разное время - никакого хаоса.
С реальными спрэдами, насколько слышал, и часть котировок Альпари.
Есть тьма статей на тему как тестировать с реальными спрэдами.
Имхо, вместо адекватных тестов вы выдумываете никому не нужные костыли.



Честно говоря не встречал не одной статьи, которая бы полностью раскрывала тему тестирования советников с реальным спредом, именно с реальным, чтобы он соответствовал времени и не был фиксированным как в MT4, когда один и тот же заданный спред используется повсеместно, советник строчит сделки даже в ролловер, когда не один нормальный советник не открылся бы, до этого использовал дневные советники, на спред особого внимания не обращал, сейчас начал интересоваться ночной торговлей, возникла проблема со спредом, нашел только одно решение, это TDS, но там лицензия дается только на один ПК, чтобы установить на другой, нужно приобретать еще одну, у меня например несколько старых ноутбуков, которые я использую как хранилище, а так же для оптимизации роботов, не хочется платить за одну и ту же прогу несколько раз, еще и за ежемесячную поддержку, поэтому начал искать альтернативу, функционал не важен, самое главное для меня это не фиксированный спред связанный со временем и приближенный к реальности, чтобы вы посоветовали?
#4743

TDS стоит смешные деньги, покупаете на один ПК и пользуйтесь сколько пожелаете.

#4744


TDS стоит смешные деньги, покупаете на один ПК и пользуйтесь сколько пожелаете.



На один ПК это ладно, а если их несколько? На одном ПК у меня оптимизация некоторых роботов может длиться больше месяца, поэтому я использую старые ноутбуки, разбиваю параметры на группы и ставлю их оптить все одновременно, чтобы сократить время оптимизации, то есть для моих целей мне придется покупать несколько ключей к TDS? Мне было бы гораздо проще и дешевле заказать программисту ту примочку о которой я написал в шапке темы и которую назвали никому не нужным костылем, и гонять ее на импортированных котировках 99% в тестере MT4, отдав те же 100$ программисту за написание один раз, чем отдать за TDS 600$ + за ежемесячную поддержку раз месяц, результаты пусть будут не такие достоверные, но зато максимально приближенные к реальности или я не прав?

Изменено 29 июля, 2017 пользователем izeran6565

#4745

Эту примочку надо в каждом боте делать, имхо тдс дешевле будет. спрэды у каждого брокера разные, а история спрэдов есть не у каждого брокера, надо собирать реальные тики укаждого брокера по всем инструментам. В общем работы на всю жизнь...
Удачи!

#4746
izeran6565, а ничего, что оптить со спрэдами на шару вы сможете года через 3 - после того, как лично соберете реальные котиры всех нужных вам пар на всех нужных вам брокерах?!
А ближайшие пару лет опту/тестам ни-ни?!
При том, что за 3 года круглосуточной включенности для сбора котиров ваша коллекция старых ноутбуков как раз Богу душу и отдаст!
И даже после этого вы не сможете тестить всех ботов, в код которых нельзя будет воткнуть понимание этой приблуды.

я понимаю вашу попытку за сотку баксов решить проблему на пару штук.
но вам нужен нормальный сервер для опта, в котором вы сможете за часы вместо месяцев комплексно оптить все параметры ботов на правильных котирах единственной копии TDS2.

Вы ж должны знать сколько денег стоит время и что ваши развлечения с оптом на старых ноутах эквивалентны потерям прибыли от всего, как минимум, за столько же месяцев...
#4747


1. Как перекрашивать бары в другой цвет?
2. Как рисовать прямоугольники?
3. Как над баром вывести текстовую информацию, например цену открытия.


1) Функция ChartSetInteger, свойства CHART_COLOR_CHART_UP и CHART_COLOR_CHART_DOWN (меняются, естественно, цвета всех баров графика - назначить цвет отдельного бара можно только в MQL5)
2) ObjectCreate, тип объекта OBJ_RECTANGLE
3) ObjectCreate, тип объекта OBJ_TEXT, в качестве точки привязки к графику использовать время и цену соответствующего бара. В общем, подружитесь с документацией, и вам откроется тайна тайн.
#4748


1) Функция ChartSetInteger, свойства CHART_COLOR_CHART_UP и CHART_COLOR_CHART_DOWN (меняются, естественно, цвета всех баров графика - назначить цвет отдельного бара можно только в MQL5)
2) ObjectCreate, тип объекта OBJ_RECTANGLE
3) ObjectCreate, тип объекта OBJ_TEXT, в качестве точки привязки к графику использовать время и цену соответствующего бара. В общем, подружитесь с документацией, и вам откроется тайна тайн.



Спасибо!
Бары перекрашиваю DRAW_HISTOGRAM, а вот с объектами предстоит разобраться.
Помогает смотреть коды встроенных в терминал индюков, но именно по моим вопросам примеров мало, поэтому ковыряю инфу по крупицам.
#4749

Здравствуйте коллеги! Помогите пожалуйста решить проблему с функцией "Безубытка". При тестировании, терминал выбивает ошибку OrderModify error 130. Буду признателен за любую помощь.


void BU()
{
for(int i=0; i {
if(OrderSelect(i, SELECT_BY_POS))
{
if(OrderType()==OP_BUY)
{
if(OrderOpenPrice() {
if (!OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,clrGreen))
Print ("Проблема параметров БУ!");
}
}

if(OrderType() == OP_SELL)
{
if(OrderOpenPrice()>=(Ask+BULevel)*Point)
{
if (!OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,clrGreen))
Print ("Проблема параметров БУ!");
}
}
}
}
}

#4750

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

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

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