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

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

#4451

В общем Вам нужно перечитать все что я писал выше. Вдумчиво перечитать. Я ответил максимально развернуто, как только возможно. Если хотите выйти на нормальный уровень программирования, то не спешите. Не хватайтесь сразу за непосильные вещи, идите от простого к сложному. Если чего то не понимаете, то делайте шаг назад и заново повторяйте. Вы должны научиться четко понимать что, где и почему пишется в коде. Должны самостоятельно научиться делать логические конструкции.
Ну вот что Вы написали здесь? Сначала присваиваете LastTradeSignal=0, а потом тут-же переопределяете значение LastTradeSignal=1. В чем смысл? Я же написал как надо. Где условия, при которых LastTradeSignal принимает то или иное значение?

я уже исправился, извиняюсь, но по Вашему работает только бай, сел продолжает открывать.
if(DN_Trend()==true) LastTradeSignal=OP_SELL;
if(UP_Trend()==true) LastTradeSignal=OP_BUY;

Добавлено: 05-05-2017 13:44:42

slopeEND.mq41 скач.

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

#4452

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


d1w4m3, вот так железобетонно должно все работать \M/

slopeEND.mq45 скач.

Изменено 5 мая, 2017 пользователем DreamWorks

#4453

DreamWorks с меня бутылка и не одна))благодаря Вашему терпению, научился многому :d


Добавлено: 05-05-2017 16:30:11

if(LastTradeSignal==-1)
{
if(DN_Trend()==true) LastTradeSignal=OP_SELL;
if(UP_Trend()==true) LastTradeSignal=OP_BUY;
if(LastTradeSignal==-1)return;
}
Если переменная равна -1
то начинается перебор условий,
если попал на -1 опять
возвращение
Я правильно понял?

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

#4454

DreamWorks с меня бутылка и не одна))


Ловлю на слове ;)

Если переменная равна -1
то начинается перебор условий,
если попал на -1 опять
возвращение
Я правильно понял?


Да, все правильно. Переменной LastTradeSignal при объявлении присваивается значение -1, которое никогда не может быть возвращено сигнальными функциями. Я просто подумал, что у Вас при старте советника может быть ситуация, что обе функции вернут false. Поэтому сделал железный вариант. Пока переменной LastTradeSignal не будет присвоено OP_SELL или OP_BUY, то он просто не начнет работу и его будет постоянно выбрасывать из функции OnTick() оператор return.
#4455

. Строка if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==FALSE ) break; допустима, но с точки зрения логики и синаксиса избыточна и не совсем корректна.Может поменять на ticket так как торгую на 10 валютных парах тф Н4
и поиск ордеров проводить по тикету,


Можно и по тикетам, но придётся вести учёт тикетов, я думаю что через SELECT_BY_POS будет проще, так что с логикой и синаксисом всё в порядке ;)


4. Условие if(OrderStopLoss()!=sl) некорректно. А как тогда корректно если стоп идёт от ЕМА10? при моих условиях стоп то ставится то удаляется на каждом тике.
Так может здесь кто подскажет


Условие не совсем корректно из-за того, что функция OrderStopLoss() возвращает значение типа double и сравнивать придётся до 30 знаков после запятой и бывает что расчётный СЛ = 1.1000, а реально OrderStopLoss() = 1.09999999...(9)
и зачем Вам на каждом тике проверять СЛ, если он меняется по закрытию бара? Чтоб сделать проверку по закрытию бара нужно вставить в код проверку (в Вашем примере сразу после ф-ции Старт):
static datetime dt = 0;
if ( dt == Time[1] ) return();
dt = Time[1];
и далее Ваш код.
#4456

Друзья, изучаю MQL4 и решил написать советник для системы Lazy Trader.
Советник написан, но некорректно работает.
Я уже получал обратную связь по коду советника и очень за это благодарен. кое-какие ошибки я уже исправил.

Ошибка, которую я вижу - это ордера не закрываются по времени. Возможно есть еще какие-то ошибки.

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

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

1/ В начале недели дожидаемся закрытия первой четырех-часовой свечи.
2/ Ставим отложенные ордера Buy Stop и Sell Stop на 20 пунктов выше High и на 20 пунктов ниже Low этой свечи.
3/ Стоп-лосс ставится на уровне противоположного ордера. Тейк-профит не ставим.
4/ При достижении ордером прибыли, равной стоп-лоссу, переводим стоп в безубыток (переносим стоп-лосс позиции на цену ее открытия).
5/ Второй ордер после активации первого, НЕ УДАЛЯЕМ!
6/ В конце недели удаляем / закрываем все ордера, независимо от их прибыли / убытка.

Спасибо за помощь:)

Прикрепляю файл с кодом советника

Lazy_Trader_Expert.mq42 скач.

#4457

Сделал сеточного советника по видеоурокам. Нужен совет по Трейлингу. На видеоуроках был пример трейлинга для несвязанных ордеров, но в советнике они же связаны и у меня всё запуталось. В общем что-то вот такое получилось.
Аналогичная тема на MQL сайте есть.

Прошу вас дать совет как сделать трейлинг на связанные открытые позиции - их 3 как правило.

В коде именно часть под названием void Trailing() вызывает непонимание, естественно я код уже искаверкал что был после видеоурока, не знаю что здесь придумать. В целом советник вроде неплохой, потихоньку его надстраиваю.

Спасибо, если кто заморочится и даст совет по реализации кода для Трейлинга в данной модели советника.

Прикрепил советника и фотку с отчётом.

BLACKJACKHOOKERS_TrailX.mq46 скач.
EURUSD_deposit_100_$_TrailX.gif
EURUSD_deposit_100_$_TrailX.htm1 скач.

#4458

А Вы что тралить то пытаетесь?

#4459

static datetime dt = 0;
if ( dt == Time[1] ) return();
dt = Time[1];
и далее Ваш код.


так выдает ошибки, а если добавить 0 в ретурн то ошибок нет
static datetime dt=0;
if(dt==Time[1])return(0);
dt=Time[1];
#4460

И это опять я))
Отвалилась переобувка сигнала, при появлении нового!
Не получилось ли так, что в Ваш цикл кидается по отдельности первый сигнал бай, а потом и первый сигнал сел?И от этого тогда он не видит первый открытый ордер?ps я честно пересмотрел и перечитал все! Изменял условия, блоки и тд. @-)

.jpg8 скач.

#4461

Отвалилась переобувка сигнала, при появлении нового!



d1w4m3, выражайтесь, пожалуйста, человеческим языком. Что значит "переобувка сигнала"? Я не писал никаких циклов, Вы о чем? Не понял Вашей проблемы.
#4462

Извиняюсь.
Например:
Открыт бай, когда тренд меняется(цвет индикатора), на DN_trend, должен закрыться бай и открыться селл(как было раньше).
Теперь сел отрывается а бай не закрывается!


Добавлено: 06-05-2017 15:50:27

if(LastTradeSignal==-1)
{
if(DN_Trend()==true) LastTradeSignal=OP_SELL;
if(UP_Trend()==true) LastTradeSignal=OP_BUY;
if(LastTradeSignal==-1)return;
}
Пока LastTradeSignal не будет присвоено OP_SELL или OP_BUY, новый ордер не откроется
не могу сформулировать правильно вопрос черт(
Первым ордером считается или бай или селл, или они по отдельности будут первыми, для сел позиций сел, для баев бай.
извиняюсь но по другому не могу, буду учиться

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

#4463

Приветствую,

ну как что тралить - профиты))) Там на уроке про модификацию ордера сообщалось ну а как же это сделать можно если связанные ордера? и профит я там снимаю по всем трём ордерам. Знаний не хватает. Можно ли в такой схеме вообще трейлинг применять? Я там нашКОДил ерунду какую-то - вроде бы тралит судя по отчётам теста МТ4, раньше строго на уровне тейкпрофита ордера закрывались а сейчас и в 3 и в 5 раз больше может забрать но всё равно некорректно это всё, поэтому и ищу помощи у специалистов если время есть подумайте пожалуйста как натрейлить корректно можно в такой схеме контр-ордеров. Мне пришлось аналогию применить только к последнему открытой позиции из трёх - она может быть и buy и sell позицией, ну и что-то запутался я там с кодом в функции Trailing(); - не нравится мне это. Хочется трейлинг, но корректно не могу его в такой ордерной схеме применить...

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

Изменено 6 мая, 2017 пользователем geratdc

#4464

Извиняюсь.
Например:
Открыт бай, когда тренд меняется(цвет индикатора), на DN_trend, должен закрыться бай и открыться селл(как было раньше).
Теперь сел отрывается а бай не закрывается!


То, что мы с Вами вчера написали абсолютно никак не связано с закрытием ордеров. Оно лишь влияет на открытие новых ордеров. А точнее на то, чтобы открытие по сигналам функций чередовалось. Если у Вас не закрывается ордер, то смотрите на корректность условий, при которых он обязан закрыться. Есть очень простое, но очень эффективное правило: если событие не наступает, значит нет условий для его наступления. Вот и все. Давайте посмотрим при каких условиях у Вас закрываются ордера:

//закрываем селл-ордера
if ( CountSell()>0 && Open[4] > uptr && Close[4] > uptr && UP_Trend()==true)

//закрываем бай-ордера
if ( CountBuy()>0 && Open[4]
Здесь присутствуют два условия, в которых с большой вероятностью и кроется причина не закрытия противоположного ордера, это Open[4]
#4465

Хм... то-то я смотрю вы тейкпрофит тянете впереди цены, как морковку перед осликом :d Ну и судя по картинке, этот прием Вам удался ;) В коде у Вас написано конечно много странных вещей, поэтому я подумал, что мне это показалось... А вообще обычно принято тралить стоп. На то он и называется трейлингСТОП. Урок, о котором Вы говорите, я не помню о чем там речь конкретно шла, пересматривать конечно не стану. Вы опишите просто свою задачу. Что Вы имеете ввиду под "связанные ордера"? Судя по коду, ордера у Вас закрываются при достижении определенной суммы профита в валюте по всем ордерам. В таком варианте тралить можно только сумму общего профита всех ордеров.

#4466

06/05/2017

В таком варианте тралить можно только сумму общего профита всех ордеров.



То что я там сделал неверно конечно. Вот именно об этом я тоже думал. Хорошо попробую завтра вникнуть ещё раз и применить к этой функции. Попробую её потралить но не уверен что получится.

А урок вот какой был. код я прилагаю. Я и постарался по аналогии сделать, но там модификация была стопов а я не мог это применять на стоппереворотных ордерах.

07/05/2017

Готово!

Посмотрите пожалуйста насчёт логики. Вроде получилось через CalculateProfit трейлить, но удивительно то, что старый (вчерашний) код ровно такие же итоги выдаёт после того как я все параметры привёл к одинаковым значениям для теста, а TakeProfit, TrailingStep и TrailingStop приведены везде к типу double.

Больше всех наторговал советник без трейлинга - но если сравнить количество трейдов у него их больше.

Вопрос такой: в чём выгода тогда трейлить? Если в итоге прибыли меньше? Какая выгода от меньшего количества трейдов? Не понимаю.

Прилагаю фото тестов.

SimpleTrailing_Lesson5.mq47 скач.
BLACKJACKHOOKERS_TrailX.mq42 скач.
BJH_100_TrailX_OFF.gif
TrailX_100_New_code.gif
TrailX_100_Old_code.gif
BJH_100_TrailX_OFF.htm0 скач.
TrailX_100_New_code.htm3 скач.
TrailX_100_Old_code.htm3 скач.
BLACKJACKHOOKERS.mq42 скач.

Изменено 8 мая, 2017 пользователем geratdc

#4467

if(UP_Trend()==true && LastTradeSignal != OP_BUY) /// Если Аптренд правда и последний сигнал не равен бай
{
if( CountBuy() == 0 && Open[3] > uptr && Close[3] > uptr) //// И если нет открытых баев, (открытие и закрытие 3 свечи) больше аптренда
{
if ( CountSell()>0) ///Если сел открыт
{
if (OrderSelect(SELECT_BY_POS, MODE_TRADES)) /// выбираем ордер
{
if (OrderMagicNumber() == Magic && OrderType() == OP_SELL ) /// по мейжику и типу
if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black)) //// закрываем его
Print("Ошибка");
}


ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "Sloper", Magic, 0, Blue);//// открываем бай
if (ticket>0) //// если ордер открыт
{
TP = NormalizeDouble(OrderOpenPrice() + TakeProfit*Point, Digits); //// приводим в порядок ТР И SL
SL = NormalizeDouble(OrderOpenPrice() - StopLoss*Point, Digits);

if (OrderSelect(ticket, SELECT_BY_TICKET)) ///////выбираем ордер
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0)) ///// и модифицируем
Print("Ошибка на покупку");
LastTradeSignal=OP_BUY; ////////запоминаем последний тип одера
}
}
}
}
Вот я правильно читаю код или нет?

#4468

Вот я правильно читаю код или нет?


d1w4m3, понимаете то, ЧТО должно быть написано правильно, но пишете не правильно. Привел Ваш код в нормальный вид и прокомментировал. Но исправлять ошибки не стал, лишь указал на них, думаю сами должны додумать. И еще. Когда вы проверяете выполнение каких-то условий, то надо писать так, чтобы действие, которое зависит от выполнения условия, не могло выполниться, если условие не выполнено. Нет смысла писать, например вот это:
if (OrderMagicNumber() == Magic && OrderType() == OP_SELL ) /// по мейжику и типу
if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black)) //// закрываем его

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

Ваш код


if(UP_Trend()==true && LastTradeSignal!=OP_BUY) /// Если Аптренд правда и последний сигнал не равен бай
{
if(CountBuy()==0 && Open[3]>uptr && Close[3]>uptr) //// И если нет открытых баев, (открытие и закрытие 3 свечи) больше аптренда
{
if(CountSell()>0) ///Если сел открыт
{

//Какой ордер здесь выбран???! Где индекс выбираемого ордера???
if(OrderSelect(SELECT_BY_POS,MODE_TRADES)) /// выбираем ордер
{
if(OrderMagicNumber()==Magic && OrderType()==OP_SELL) /// по мейжику и типу
{
if(OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Black)) //// закрываем его
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"Sloper",Magic,0,Blue);//// открываем бай

if(ticket>0) //// если ордер открыт
{
TP=NormalizeDouble(OrderOpenPrice()+TakeProfit*Point,Digits); //// приводим в порядок ТР И SL
SL= NormalizeDouble(OrderOpenPrice() - StopLoss*Point, Digits);

if(OrderSelect(ticket,SELECT_BY_TICKET)) ///////выбираем ордер
{
if(!OrderModify(ticket,OrderOpenPrice(),SL,TP,0)) ///// и модифицируем
Print("Ошибка на покупку");
}
LastTradeSignal=OP_BUY; ////////запоминаем последний тип одера
}
}
else Print("Ошибка");
}
}
//Гарантированно получаем эту запись в журнале
else Print("Ордер для закрытия не выбран!");
}
}
}

#4469

Спасибо за ответ, но по Вашему получается, если ордер не открыт то и вся эта цепочка не сработает!
Как я понимаю,
если условие сработала,
если ордер сел открыт
тогда мы его закрываем и открываем бай!
А если ордер не открыт не понимаю что тогда будет происходить?
По поводу тикета: опять же если ордер открыт тогда я могу использовать
if (OrderSelect(ticket, SELECT_BY_TICKET))
А по другому придется опять вернуться к
for(int i = OrdersTotal() -1; i>=0; i--){
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
Или я окончательно запутолся?

#4470
d1w4m3, Вы сами должны предусмотреть, продумать и прописать все возможные ситуации. Если ордер открыт, то делаем то-то. Если не открыт, то, соответственно, открываем и т.д. У оператора if-else кроме if есть еще и else. Это первое.

Второе. Если не знаете, какой тикет у закрываемого ордера, то Ваш путь - цикл с перебором всех подходящих ордеров. Так, как Вы написали if(OrderSelect(SELECT_BY_POS,MODE_TRADES)), писать нельзя и работать это не будет.

Третье. Если мы продолжим в том же ритме обсуждать здесь Ваш код, то ветка напрочь зафлудится только нашей с Вами перепиской. Думайте, думайте и еще раз думайте, и только потом задавайте вопросы.
#4471

Подскажите, плиз, такую вещь.
Я использую в боте различные таймфреймы, от М1 до D1. Обычно ставлю его на реале на М1 и никаких проблем не возникает, значит все верхние тф либо подгружаются на автомате, либо пересчитываются из М1. Кстати, как на самом деле?
Если открыт график М1, история по другим периодам подкачивается тоже?
Так вот. Возникла проблема - 20 графиков М1 жрут 6 гигов оперативы.
Отлаживал код, отлаживал... Думал, может проблема в неэффективном коде. Все прилизал, все летает, но нет.
По прежнему 6 гигов. Снял ботов, оставил графики - точно, сами графики М1 жрут тучу оперативы.
Короче, вопрос.
По большому счету, совам моим пофиг, на каком периоде стоять, таймфреймы заданы жестко в коде,
но я считаю закрытие М1 свечи, чтобы по всем тикам не гонять сову и не зависеть от тиковой истории.
Так вот, если я поставлю сову на графики Н1, например, история по более коротким ТФ будет в процессе работы подкачиваться автоматом?
Или придется какой нибудь рефреш прикручивать для принудительной загрузки?
Может кто уже вертел, знает, а то неохота проверять. Время все таки.

#4472

Ок спасибо.
if(UP_Trend()==true)
{
if ( CountSell()>0 && uptr!=dntr)
{
for(int i = OrdersTotal() -1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() == Magic && OrderType() == OP_SELL )
if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black))
Print("Ошибка");
Все оказалось очень просто)))Еще раз спасибо за терпение

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

#4473

2Silentspec - мне помогало от прожорливости мт удаление(или перенос) всего лишнего из indicators и experts,, и обязательного удаления mqlcache.dat там и там для пересчета содержимого. Все это при выключенном терминале.

#4474

...значит все верхние тф либо подгружаются на автомате, либо пересчитываются из М1. Кстати, как на самом деле?
Если открыт график М1, история по другим периодам подкачивается тоже?


Да. Если открыт M1, а советник обращается к периоду, отличному от M1, то история будет подкачиваться именно по тому периоду, к которому обращается советник. Ничего не пересчитывается.

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


Все должно автоматом подкачиваться. Сейчас специально эксперимент провел. Повесил советник на H1, а в комментарий вывел цену закрытия Close[100] с M1. При этом для чистоты эксперимента оставил только файл истории H1. В комментарий успешно вывелась цена закрытия сотого бара с M1. После эксперимента проверил папку с файлами истории. Появился файл истории M1. Так что, думаю нет проблем, чтобы сов висел на H1, а работал с историей M1.
#4475

В общем советник мною чуть подправлен по входу в торговлю и вроде меньше проблем стало связанных с просадками (банкротством). Но всё равно их хватает конечно)))

На этом остановлюсь.

Будет что новое по организации корректного трейлинга - пишите на почту пожалуйста. Пока оставлю так, тесты более-менее его наличие подтверждают, а сливы там если происходят то по контр-движению рынка и просадке сверх депозита. Ну как обычно)))

Прилагаю фото тестов по котировкам за 4 месяца:
с Января до Мая 2017 года - архив котировок от тиковой мили (Tick Mill)

Спасибо вам за идеи, успехов!

На MQL официальном сайте есть тема посвящённая данному алгоритму, кому интересно - вы можете её найти в аналогичном на TradeLikeAPro профиле. Тема называется "Необходимо описать процедуру алгоритма" :).

BLACKJACKHOOKERS.mq43 скач.
BLACKJACKHOOKERS_TrailX.mq43 скач.
EURUSD_deposit_100_$.gif
EURUSD_deposit_1_000_$.gif
EURUSD_deposit_10_000_$.gif
GPBUSD_deposit_100_$.gif
GPBUSD_deposit_1_000_$.gif
GPBUSD_deposit_10_000_$.gif
README.txt5 скач.
Настройки_тестов.txt3 скач.

Изменено 8 мая, 2017 пользователем geratdc

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

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