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

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

#1051



Сделал вместо == Теперь открывает только Sell и не при смене цвета,а один за другим.

Вы ранее писали : "А у меня гистограмма" - это означает, что индюк в подвале (отдельном окне под графиком) значение например = 45
Вдумайтесь: КАК можно сравнивать Ask > 45 ??? Поэтому у Вас всегда Селл потому что Bid Ранее я писал КАК нужно сравнивать. Ведь значением буфера будут либо пусто (Empty_Value), либо некая цифра (например 45), поэтому нужно писать:
if (мой_индюк_буф0 != Empty_Value && ... ) и
if (мой_индюк_буф1 != Empty_Value && ... ). Понятно?


ВОТ ОГРОМЕННОЕ СПАСИБО!!! бум пробовать.
#1052

Здраствуйте всем,подскажите как правильно записать строчку условия что бы советник закрывал сделки от процента баланса, я написал вот так :
extern double Percent_Risk = 5.0;

Close_loss=NormalizeDouble(OrderProfit()-AccountBalance()*100/Percent_Risk,2);
if(Close_loss) {Close_Orders();}
Получается что при открытии самым минимальным лотом,советник тут же закрывает все.

Изменено 30 июня, 2014 пользователем denis77515

#1053


Здраствуйте всем,подскажите как правильно записать строчку условия что бы советник закрывал сделки от процента баланса, я написал вот так :
extern double Percent_Risk = 5.0;

Close_loss=NormalizeDouble(OrderProfit()-AccountBalance()*100/Percent_Risk,2);
if(Close_loss) {Close_Orders();}
Получается что при открытии самым минимальным лотом,советник тут же закрывает все.

Да уж...
Рассмотрим простой пример:
Баланс 100$, Профит ордеров = -6$. Теперь смотрим на Вашу формулу:
Close_loss= -6 - 100 * 100 / 5 = -6 - 2000 = -2006
if (-2006) - что Вам даёт?

Мой вариант:
bool Close_loss = false;
Close_loss= AccountBalance()/100*Percent_Risk + OrderProfit() if(Close_loss) {Close_Orders();}
#1054

Спасибо за критику но я пробовал записать условие таким образом
Close_loss=NormalizeDouble(OrderProfit()-AccountBalance()*100/Percent_Risk,2); if(Close_loss && OrderProfit Close_loss=NormalizeDouble(OrderProfit()-AccountBalance()/Percent_Risk *100,2); if(Close_loss && OrderProfit

Изменено 30 июня, 2014 пользователем denis77515

#1055


Close_loss=NormalizeDouble(OrderProfit()-AccountBalance()*100/Percent_Risk,2); if(Close_loss && OrderProfit

Вы такое сами придумываете или копируете откуда-нибудь? (просто интересно)
Как можно double (Close_loss=NormalizeDouble) без логической операции в if() засунуть?
#1056

:d скопировал на скору руку, а чего скопировал как теперь стало понятно сам не понял :d

#1057

Добрый день .
3 урок .
Пишет такие предупреждения в тестере :
return value of 'OrderModify' should be checked
return value of 'OrderClose' should be checked
return value of 'OrderSelect' should be checked

Подскажите что не так .

#1058

Эти функции возвращают значение true/false - справилась/несправилась
Поэтому хочет чтоб Вы поинтересовались и похвалили ;)
Можно вызвать так: bool res = OrderClose(...);

#1059

Доброго времени суток
Есть два вопроса, подскажите
1. Может ли элемент массива содержать структуру. Например, есть структура из 3 элементов (тикет , объем и прибыль выбранного ордера). Может ли массив состоять из элементов, каждый из которых содержит в себе такую структуру?
2. Если да, можно ли сортировать массив с помощью функции ArraySort по элементам структур (например расположить все элементы массива в порядке возрастания прибыли)?
Если можно приведите пример

#1060


Есть два вопроса, подскажите
1. Может ли элемент массива содержать структуру?
2. Если да, можно ли сортировать массив с помощью функции ArraySort?
Если можно приведите пример

Если Вас интересуют такие вопросы - значит Вы не новичок в MQL-программировании => можете самостоятельно забацать такой массивчик и попробовать отсортировать.
Моё имхо (не проверял!): массив структур возможен (только вот не знаю: если структура содержит строки - то возможны варианты), а вот сортировка, да ещё и по конкретному полю структуры - нет.
#1061

Добрый день . У меня опять несколько вопросов .
1) индикатор iMA .
ma_shift - Сдвиг индикатора относительно ценового графика.
Я так понимаю , что если поставить значение 0 , то сдвига не будет ?

2) Для того чтобы проверить изменила МА направление движения надо написать код ?

МА1 = double iMA(symbol, 0, 10, 0, MODE_SMA, PRICE_CLOSE, 1);
МА2 = double iMA(symbol, 0, 10, 0, MODE_SMA, PRICE_CLOSE, 2);
if МА1
И если, допустим, МА будет больше 2х значений, можно это описать в цикле или нужно выполнять сравнение каждый раз ?
Если можно написать в цикле то примерно как это будет выглядеть .
Так же если вместо MODE_SMA , PRICE_CLOSE написать значение 0 , то программа это поймет ?
И можно ли эти переменные модифицировать ?

3) И как сделать так , чтобы кидаешь сову на один ТФ , а часть индикаторов берет значения с другого ?
Насколько я понимаю что в условиях индикатора в значении "период" указываем значение подходящего нам ТФ . например PERIOD_H4 , а сова на Н1 .

Или эта информация есть в дальнейших уроках ?

#1062


1) индикатор iMA .ma_shift - Сдвиг индикатора относительно ценового графика.
Я так понимаю , что если поставить значение 0 , то сдвига не будет ?

Да.
Цитата

2) Для того чтобы проверить изменила МА направление движения надо написать код ?

Да.
Цитата


МА1 = double iMA(symbol, 0, 10, 0, MODE_SMA, PRICE_CLOSE, 1);
МА2 = double iMA(symbol, 0, 10, 0, MODE_SMA, PRICE_CLOSE, 2);
if МА1

Этим Вы определите направление МА на последних барах. Смена направления смотрится на минимум 3 барах
Цитата

И если, допустим, МА будет больше 2х значений, можно это описать в цикле или нужно выполнять сравнение каждый раз ?

Первую часть фразы не понял. Нужно сравнивать не в цикле - зачем?, а по закрытии текущего 0-бара
Цитата


Так же если вместо MODE_SMA , PRICE_CLOSE написать значение 0 , то программа это поймет ? И можно ли эти переменные модифицировать ?

Это не переменные а именованные константы и у каждой есть своё значение смотри здесь
Цитата

3) И как сделать так , чтобы кидаешь сову на один ТФ , а часть индикаторов берет значения с другого ?

В коде совы вызываете индикатор с другого ТФ - если сделаете аккуратно - проблем нет.
#1063

По прочтению этой темы, а так же просмотру уроков Сергея xbms (за, что Вам и благодарность) я написал своего первого советника. Советник написан на основе MACD. В общем не сложный, но тем не менее показывает (показывал бы) некоторую прибыльность, беда в том, что он не всегда открывает и что хуже не всегда закрывает ордера. Примерно из десяти открытых ордеров один не закрывается не смотря на то, что условия для закрытия ордера наступили. Аналогично не всегда открывает ордера, хотя все условия для открытия ордера есть. Я конечно могу ставить стоп лосс и он предусмотрен, но для получения статистики, при скольких пунктов в минусе будет срабатывать советник на закрытие я стоп лосс отодвинул заведомо дальше возможного срабатывания.
Не много о советнике. Ордер на покупку или на продажу открывается сразу как совпадут движения цены на нескольких тайм фреймах. На каждую пару баров свой индикатор (Они все MACD только переименованные) Советник был установлен на 23 парах, потом уменьшил количество пар да шести и всё равно уже однажды ордер не был открыт.
Вот и вопрос от чего не закрываются ордера и как с этим бороться?
И второй вопрос на скольких валютных парах можно устанавливать советник, что бы они не мешали друг другу?
И сразу третий вопрос сколько терминалов можно одновременно установить и запустить на компьютере, что бы они не конфликтовали?
Заранее спасибо.

#1064
Вячеслав_57
Сова не открывает/не закрывает ордера - прогоните в тестере в визуал мод. только придётся вручную установить индюк с аналогичными параметрами. Вопросы могут отпасть.
По поводу загрузки терминала: Мт4 - однопоточный, т.е. все индюки и совы выполняются последовательно друг за другом после прихода тика. т.е. на спокойном рынке я думаю проблем не будет, а вот на новостях тики будет пропускать. Поэтому Вам никто не подскажет - сами решайте (мы ж не знаем насколько Ваши совы наворочены, да и производительность Ваших компов для нас загадка).
#1065

Всем привет!

Есть такая проблема...

Объявляю переменную
MqlRates mRates[];

Далее в коде заполняю и обращаюсь к первому элементу
RefreshRates();
CopyRates(s,PERIOD,0,1,mRates);
Price=NormalizeDouble(mRates[0].open,digits);

Всегда при первом запуске! эксперта появляется ошибка "array out of range" и указатель на mRates[0]
В сети нашёл такое объяснение - "Да, динамические массивы надо явно распределять перед использованием."
Подскажите, пжлст, как это сделать.


Добавлено: 10-07-2014 11:01:46


Советник был установлен на 23 парах, потом уменьшил количество пар да шести и всё равно уже однажды ордер не был открыт.
Вот и вопрос от чего не закрываются ордера и как с этим бороться?
И второй вопрос на скольких валютных парах можно устанавливать советник, что бы они не мешали друг другу?
И сразу третий вопрос сколько терминалов можно одновременно установить и запустить на компьютере, что бы они не конфликтовали?
Заранее спасибо.


1. У брокеров существует ограничение по количеству открытых ордеров, в т.ч. и отложенных. Обычно не больше 200 шт.
Смотрите какую ошибку выдаёт эксперт.
2. Мне не совсем понятно зачем устанавливать несколько советников? Скорее всего совы конфликтуют между собой. В терминале предусмотрен всего один поток для связи с сервером и если он занят каким нибудь экспертом или скриптом, то другой получает ошибку. Чтобы проверить занят ли поток используйте IsTradeAllowed().
Лучше пусть один эксперт торгует всеми парами...
3. Точно сказать не могу, но у меня 6 работаю круглосуточно.

Изменено 10 июля, 2014 пользователем pagatr

#1066

Вопроса больше нет)
Если кому интересно как синхронизировать терминалы, я нашел 3 способа:

1)Файлы
2)Pipe каналы
3)Memory Mapped Files

Я не силен в программировании, поэтому не знал как можно это сделать(синхронизацию терминалов).

Изменено 14 июля, 2014 пользователем blackmaloi

#1067


Добрый день .
3 урок .
Пишет такие предупреждения в тестере :
return value of 'OrderModify' should be checked
return value of 'OrderClose' should be checked
return value of 'OrderSelect' should be checked

Подскажите что не так .



Возвращают булевые значения проверь короче:
if(OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0,Blue)){            

Print("OK");
}else
Print("NO");

или посмотри урок как переносить советники на новый билд!
#1068

Привет всем!!! Подскажите пожалуйста, Как программно, изменить обьем лота каждую неделю! Например каждый понедельник - увеличение лота на 0.1

#1069


Привет всем!!! Подскажите пожалуйста, Как программно, изменить обьем лота каждую неделю! Например каждый понедельник - увеличение лота на 0.1



А чё там сложного проверь на день недели
int  DayOfWeek();


0-воскресенье 1,2,3..... Загляни в документы и всё станет ясно!
#1070

ТИПА -
if (DayOfWeek()==1)
Lot=Lot+0.1;
???
Но надо ведь что бы сова запоминал обьем последнего лота и плюсовал после закрытия ордера!

#1071


ТИПА -
if (DayOfWeek()==1)
Lot=Lot+0.1;
???
Но надо ведь что бы сова запоминал обьем последнего лота и плюсовал после закрытия ордера!



Сделай 2 переменные lot и fixLot fixLot выведи как эхтерн и её увеличивай! А потом просто приравнивай к lot
#1072

Здравствуйте!
Я чуть чуть не в тему, есть ли версия курсов для Андроида, хотел на даче посмотреть, а то дома текучка заедает?
Спасибо Юра.

#1073

Здравствуйте, Сергей! Огромное спасибо за Ваш труд по созданию обучающих уроков.
Напишите пожалуйста урок как переписать советник из МТ4 в МТ5. Очень нужно для увеличения скорости оптимизации.
Спасибо!

#1074

Столкнулся с необъяснимым (мной) явлением - на Н4 советник работает прекрасно, как задумано открывает ордера, как задумано закрывает и трейлинг стоп работает, даже какие то пункты зарабатывает, мало только. Тестирую на меньшем тайм фрейме график идет устойчиво вниз с небольшими отклонениями вверх и тестер не оптимизирует параметры, соответствующие разделы пусты. И при этом выдаёт ошибку: 2014.07.24 17:59:12.880 TestGenerator: unmatched data error (volume limit 814 at 2014.07.22 06:00 exceeded). Гугл переводчик говорит "Бесподобная ошибка". Анализ сделок показывает там где нужно было Buy советник делает Sell и наоборот. С чем это может быть связано, как объяснить, на Н1 всё работает прекрасно? О советнике: третий урок + трейлинг стоп, индикаторы MA и SSRC, совсем простенький я только учусь. На всякий случай если кто нибудь заинтересуется прикладываю советник.

И сразу второй вопрос: Как сделать, что бы алерт сигналил определённое количество раз, два, три пять, но не более чем задано?
Заранее благодарю.


TrailingStop.mq414 скач.

Изменено 25 июля, 2014 пользователем Вячеслав_57

#1075

Привет ВСЕМ!!!
Вопрос прогерам!
Сначала о сове:
Советник при определенных настройках, сам меняет свой Magic, в процессе работы.
Все работает как надо, но есть проблема!
В начале новой недели или при каких то сбоях в связи, он возвращается к первоначальному Magic, который прописан в настройках.
Как сделать, например так что бы советник скидывал последние настройки во внешний файл, и подгружал при необходимости.
При сбоях и в начале новой недели?
Ну или при открытии терминала, в котором он же уже работал и выставил ордера! Например при отключении электроэнергии в сети!!!

Изменено 26 июля, 2014 пользователем Enter

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

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