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

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

#1201

Спасибо.
Я правильно понимаю, что если на счете будет открытая позиция, то этот скрипт выдаст значение минимально допустимого стоп-лосса?
Или покажет значение переменной StopLevel?

И все же интересно ваше мнение о том, чтобы вместо стопов поставить функцию закрытия ордера, если цена ушла на уровень этого предполагаемого стопа?

Изменено 25 августа, 2014 пользователем oleguitar

#1202


Спасибо.
Я правильно понимаю, что если на счете будет открытая позиция, то этот скрипт выдаст значение минимально допустимого стоп-лосса?

И все же интересно ваше мнение о том, чтобы вместо стопов поставить функцию закрытия ордера, если цена ушла на уровень этого предполагаемого стопа?



Проскальзывания.
#1203

От сильных проскальзываний и стоп-лосс не зашитит вроде.

#1204


Я правильно понимаю, что если на счете будет открытая позиция, то этот скрипт выдаст значение минимально допустимого стоп-лосса?

И все же интересно ваше мнение о том, чтобы вместо стопов поставить функцию закрытия ордера, если цена ушла на уровень этого предполагаемого стопа?

Скрипт покажет брокерские требования по выбранному символу о дистанции для СЛ или ТР. (вне зависимости открыт ордер или нет).
Можно сделать функцию и закрывать ордер по рынку. С точки зрения брокера это тот-же Стоп ордер. Исполнение будет чуть хуже (можно заметить только на быстром рынке).

Generic A-TLP v.11.94.19.rar2 скач.

#1205

Возник ещё вопрос, почитываю учебник, но пока не встретил пояснения. При написании кода по закрытию ордеров, если его расположить в теле Start, то возникают сложности при закрытии большой серии ордеров, потому как срабатывание идёт по тикам. Возникает необходимость использования цикла while для оперативного закрытия, но похоже можно написать пользовательскую функцию и получить аналогичный эффект. На реальной торговле не было возможности проверить, но в тестере вроде похоже, при этом условия по запуску удаления лучше расположить в Start-е, а в теле функции, только перебор и само закрытие, дабы избежать возможных глюков. Правильно ли я думаю?

#1206


условия по запуску удаления лучше расположить в Start-е, а в теле функции, только перебор и само закрытие, дабы избежать возможных глюков. Правильно ли я думаю?

Закрытие большой сетки растягивается по времени - цена уходит и начинаются ошибки (не зря МТ5 делали).
По поводу в каком месте прописать: разницы нет! - компилятор, при трансляции в исполняемый код, всё расставит по-своему (там не будет Старт, там точка входа). Я стараюсь не захламлять ф-цию Старт т.к. должен видеть общий алгоритм совы (всё имхо).
#1207

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

Тут у меня было на реале, в коде всё чётко прописано по закрытию (проверял сто раз), а когда дошло до дела, начало мне сыпать ошибку 129. Функция изначально была сделана пользовательской, в Start-е было только обращение к ней, а условия для срабатывания в её теле. Думал - думал что же делать, а потом разделил как описал и всё стало отрабатывать без проблем. Ну вообще сложилось впечатление, что перед циклом в одном блоке лучше ни чего не ставить.

Изменено 27 августа, 2014 пользователем chistaia-rodina

#1208
chistaia-rodina Я в шоке! Если это вылечилось простым переносом части кода, то так явно не должно быть! Сам с таким не сталкивался - мне и в голову такое-бы не пришло!
#1209


chistaia-rodina Я в шоке! Если это вылечилось простым переносом части кода, то так явно не должно быть! Сам с таким не сталкивался - мне и в голову такое-бы не пришло!



Ну там как раз наоборот, явно не должно было быть этой ошибки, но получилось исправить.
#1210

У меня на новом тереме три цикла друг в друге убивали терем наповал. Перебор массивов, в первом цикле 500 элементов, во втором 200, в третьем 20:)

#1211



Но у тебя как и у меня не решена проблема с немедленным открытием сделки на продажу после закрытия предыдущей. И неважно как закрылась предыдущая, хоть по тейку, хоть по стопу, сразу открывается следующая. ....Есть идеи?

Я эту "проблему" и не решал. Идей (решений) - море! Понять-бы смысл проблемы... Выкладывай скрины с пояснениями.

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

1.jpg

#1212


как сделать так, чтобы после закрытия первого ордера вторая продажа не открывалась?

Вы не стали делать функцию встречного закрытия? Я смотрю у Вас одновременно в обе стороны сделки.
Давайте попробуем просто:
if (cBuy + cSell > 0) Trailing();
else
{
lastPrc = 0;
----> // lastInd = -1; // - это надо закомментировать

if (lastInd == PriceSell || lastInd == PriceBuy) return(0); - эту строчку поставить перед блоком открытия 1 ордера (сейчас она перед доливкой)
т.е. сова на одном значении индюка будет делать только 1 сделку
#1213



как сделать так, чтобы после закрытия первого ордера вторая продажа не открывалась?

Вы не стали делать функцию встречного закрытия? Я смотрю у Вас одновременно в обе стороны сделки.

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

Добавлено: 27-08-2014 13:08:25


Вы не стали делать функцию встречного закрытия? Я смотрю у Вас одновременно в обе стороны сделки.
Давайте попробуем просто:
if (cBuy + cSell > 0) Trailing();
else
{
lastPrc = 0;
----> // lastInd = -1; // - это надо закомментировать

if (lastInd == PriceSell || lastInd == PriceBuy) return(0); - эту строчку поставить перед блоком открытия 1 ордера (сейчас она перед доливкой)
т.е. сова на одном значении индюка будет делать только 1 сделку


Не помогло. Результат тот же.
Я попробовал поменять начальные условия входа на эти if (Bid >= PriceSell + Otstup * Point && сSell() == 0) и перестало открывать продажу сразу после закрытия продажи...Сейчас экспериментирую дальше

Изменено 27 августа, 2014 пользователем slevg

#1214

Добрый вечер всем!
Я тут озадачился вопросом таким:
допустим, у нас какая-нибудь система, скажем, на скользящих средних, и мы входим сразу, как только быстрая пересечет медленную, у нас есть тейк-профит какой-то, после достижения которого, нужно ждать повторение такой ситуации(пересечения). Если сделать простое условие, что открывать позицию, когда быстрая выше/ниже медленной, то после тейка откроется еще одна сделка...

#1215
oleguitar так в чём вопрос?

slevg должно было помочь... Скинь сову, я код гляну.

z_0872.png

#1216
Цитата

oleguitar так в чём вопрос?



Как сделать так, чтобы советник ждал следующего пересечения, а не открывал позицию сразу же после тейк-профита?
#1217


Как сделать так, чтобы советник ждал следующего пересечения, а не открывал позицию сразу же после тейк-профита?

Если про средние, то значение быстрой средней на 2 свече меньше медленной на 2 свече, а на 1 свече - наоборот. И тогда ордера будут открываться только при пересечении, а не при нахождении медленной над длинной.
#1218

Вот кстати так и думал, только как это выглядит, не совсем понимаю... Не знаю, как получить значение скользящей на предыдущих барах
Может быть, добавить дублирующую быструю со сдвигом, и одно из значений получать от нее?

#1219


Вот кстати так и думал, только как это выглядит, не совсем понимаю... Не знаю, как получить значение скользящей на предыдущих барах
Может быть, добавить дублирующую быструю со сдвигом, и одно из значений получать от нее?

Ну что-же Вы? Здесь написано
на 2 баре: =iMA(NULL,0,13,8,MODE_SMMA,PRICE_MEDIAN, 2);
#1220

Ребят, подскажите как в MQL4 (Старый билд) сделать проверку цены закрытия определённого дня? Например узнать цену закрытия пятницы

Автор#1221


Ребят, подскажите как в MQL4 (Старый билд) сделать проверку цены закрытия определённого дня? Например узнать цену закрытия пятницы



Приветствую!
Учитесь работать со справкой... Есть индикатор:

iClose

Возвращает значение цены закрытия бара (указанного параметром shift) соответствующего графика.

double iClose(
string symbol, // символ
int timeframe, // период
int shift // сдвиг
);



Параметры

symbol

[in] Символьное имя инструмента. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

shift

[in] Индекс получаемого значения из таймсерии (сдвиг относительно текущего бара на указанное количество баров назад).

Возвращаемое значение

Значение цены закрытия бара (указанного параметром shift) соответствующего графика или 0 в случае ошибки. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError().

Примечание

Для текущего графика информация о ценах закрытия баров находится в предопределенном массиве Close[].

Пример:

Print("Current bar for USDCHF H1: ",iTime("USDCHF",PERIOD_H1,0),", ", iOpen("USDCHF",PERIOD_H1,0),", ",
iHigh("USDCHF",PERIOD_H1,0),", ", iLow("USDCHF",PERIOD_H1,0),", ",
iClose("USDCHF",PERIOD_H1,0),", ", iVolume("USDCHF",PERIOD_H1,0));





#1222


slevg должно было помочь... Скинь сову, я код гляну.


Вот, посмотри, пожалуйста. Сам не могу понять что не так

sov.mq411 скач.

#1223


Вот, посмотри, пожалуйста. Сам не могу понять что не так

Вы не сделали так, как я писал здесь. Видимо что-то не устроило... а там была основа для дальнейшей модификации. теперь что? - заново?
Вы поймите: я пытаюсь помочь Вам не бота сделать, а научить самостоятельно программировать. Поэтому я не буду писать - это Ваша задача, я лишь помогу с ошибками.

В общем Ваша задача: бот должен открыть только один ордер на одном значении индюка, если это значение уже использовалось, то ждём следующего.
#1224



Вот, посмотри, пожалуйста. Сам не могу понять что не так

Вы не сделали так, как я писал здесь. Видимо что-то не устроило... а там была основа для дальнейшей модификации. теперь что? - заново?
Вы поймите: я пытаюсь помочь Вам не бота сделать, а научить самостоятельно программировать. Поэтому я не буду писать - это Ваша задача, я лишь помогу с ошибками.

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

У вас там по сути тоже самое, что и у меня...Работает одинаково...Вот как раз с такой задачей я и не могу справиться. Я могу переписать в вашем варианте, а вы глянете как открывать ордер на одном значении индюка. Точнее не так. На сигнале ордер открывается один, но после закрытия по стопу открывается снова в том же направлении. Вот в чем проблема. Как сделать так, чтобы сделки открывались строго только по сигналу индикатора, а не после закрытия по стопу?
#1225


Как сделать так, чтобы сделки открывались строго только по сигналу индикатора, а не после закрытия по стопу?

Варианты есть, например после закрытия ордера :
- ждать смену значения (не цвета) индикатора
- ждать 2 часа, или нового дня
- ждать изменения цены минимум на 400 пипс.

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

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