chistaia-rodina Опубликовано 14 ноября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 ноября, 2014 Ну вот я и говорю, сначала одни потом другие, только если по любому после покупок идёт закрытие продаж, то можно их объединить в одну функцию и они пройдут всё равно последовательно. Если иногда будет закрытие наоборот, то можно написать ещё одну зеркальную и вызывать их по условиям. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Crik1978 Опубликовано 14 ноября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 ноября, 2014 Ну вот я и говорю, сначала одни потом другие, только если по любому после покупок идёт закрытие продаж, то можно их объединить в одну функцию и они пройдут всё равно последовательно. Если иногда будет закрытие наоборот, то можно написать ещё одну зеркальную и вызывать их по условиям. если указать данные функции в последовательности - сначала закрыть бай а потом селл. закрытие будет проходить в такой же последовательности? Ссылка на сообщение Поделиться на другие сайты More sharing options...
chistaia-rodina Опубликовано 14 ноября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 ноября, 2014 Спойлер Ну вот я и говорю, сначала одни потом другие, только если по любому после покупок идёт закрытие продаж, то можно их объединить в одну функцию и они пройдут всё равно последовательно. Если иногда будет закрытие наоборот, то можно написать ещё одну зеркальную и вызывать их по условиям. если указать данные функции в последовательности - сначала закрыть бай а потом селл. закрытие будет проходить в такой же последовательности? Короче догнал что именно пытаетесь спросить, исполнение кода идёт слева на право и сверху вниз, плюс правило скобок как в математике по условиям. Соответственно если будут прописаны две функции подряд без каких либо разграничений, то они так и исполнятся, сначала верхняя, а потом сразу же следующая снизу. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Crik1978 Опубликовано 14 ноября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 ноября, 2014 Спойлер Ну вот я и говорю, сначала одни потом другие, только если по любому после покупок идёт закрытие продаж, то можно их объединить в одну функцию и они пройдут всё равно последовательно. Если иногда будет закрытие наоборот, то можно написать ещё одну зеркальную и вызывать их по условиям. если указать данные функции в последовательности - сначала закрыть бай а потом селл. закрытие будет проходить в такой же последовательности? Короче догнал что именно пытаетесь спросить, исполнение кода идёт слева на право и сверху вниз, плюс правило скобок как в математике по условиям. Соответственно если будут прописаны две функции подряд без каких либо разграничений, то они так и исполнятся, сначала верхняя, а потом сразу же следующая снизу. =d> спасибо. Ссылка на сообщение Поделиться на другие сайты More sharing options...
oleguitar Опубликовано 16 ноября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 16 ноября, 2014 А подскажите, как сделать выпадающее меню во внешних настройках?то есть, например, MM = true/false Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 16 ноября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 16 ноября, 2014 А подскажите, как сделать выпадающее меню во внешних настройках?то есть, например, MM = true/false Читай Ссылка на сообщение Поделиться на другие сайты More sharing options...
oleguitar Опубликовано 17 ноября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 17 ноября, 2014 А подскажите, как сделать выпадающее меню во внешних настройках?то есть, например, MM = true/false Читай tnx :)Добавлено: 17-11-2014 22:30:48А правильно ли я понимаю, что вот такая функция Спойлер double FindLastLots() { double oldlots; int oldticket; ticket = 0; for (int i = OrdersHistoryTotal()-1; i >=0; i--) { if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)== true) { if( OrderSymbol() == Symbol() && OrderMagicNumber() == Magic ) { oldticket = OrderTicket(); if( oldticket > ticket) { oldlots = OrderLots(); ticket = oldticket; } } } } return(oldlots); } будет искать лоты только для своего советника?То есть, если на одном счете два эксперта, эта функция найдет последний лот своего? Изменено 17 ноября, 2014 пользователем oleguitar Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 18 ноября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 18 ноября, 2014 будет искать лоты только для своего советника?То есть, если на одном счете два эксперта, эта функция найдет последний лот своего?Магики разные (про символ умолчу), значит и ордера разные.Вам надо подумать о досрочном выходе из цикла - при тестировании/работе будет зависать (при большой истории закрытых сделок). Досрочный выход, например, если с даты закрытия ордера прошло более месяца...Можно сохранять лот последнего ордера в переменную (глобальную или статик) и брать его для расчётов нового без всякого поиска по истории, а при открытии нового ордера - переписывать. Ссылка на сообщение Поделиться на другие сайты More sharing options...
oleguitar Опубликовано 18 ноября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 18 ноября, 2014 Ну у меня эта функция редко вызывается, тестирование нормально проходит, без тормозовВот над этим еще думаю:как бы закрыть ордер, если он старше H часов и его убыток не больше N пунктов, часто ведь бывает, что если сделка затягивается - ничего хорошего может не быть, тем более как у меня , средняя сделка 4 часа, и те, которые старше 1 дня, как правило, убыточныеНужно наверное сравнить дату закрытия с текущей, только непонятно, с чем сравнивать(if( date_current-date_last)> ??? )и Найти момент закрытия последней сделки, и записать баланс в стат. переменную, и во время сделки, продолжительностью более 1 дня, сравнивать с балансом текущим, и если он не меньше предыдущего, чем X пунктов или процентов, то закрываем. Так примерно или проще можно сделать? :-? Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 19 ноября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 ноября, 2014 Так примерно или проще можно сделать? :-?Значительно проще.В той функции, где идёт пересчёт ордеров и вычисляется профит, добавляете пару строк:if (TimeCurrent() > OrderOpenTime() + 24*3600 && OrderProfit() > -10*OrderLots()) OrderClose(OrderTicket(),OrderLots(),(double)((OrderType()==OP_BUY)?Bid;Ask),Slippage,Gray);24 - это кол-во часов, мин.профит (-10) нужно вычислять от размера лота, но можешь сделать по своему.Если возникнут вопросы по (double)((OrderType()==OP_BUY)?Bid;Ask) - читай справку, или сам вычисляй цену закрытия. Ссылка на сообщение Поделиться на другие сайты More sharing options...
oleguitar Опубликовано 19 ноября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 ноября, 2014 1) -10 - в пунктах, как я понимаю?2)А если вот так?if (TimeCurrent() > OrderOpenTime() + 24*3600 && OrderProfit() > -10*OrderLots()) CloseBuy(); void CloseBuy() { for (int i = OrdersTotal()-1; i >= 0; i--) { if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; if (!(OrderSymbol() == Symbol() && (OrderMagicNumber() == Magic))) continue; if (OrderType() == OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Red); } } Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 19 ноября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 ноября, 2014 1) -10 - в пунктах, как я понимаю?2)А если вот так?1. Только если у Вас OrderProfit() выдаёт значение в пунктах... У меня в валюте депозита.2. Отлично. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Bal Опубликовано 20 ноября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 ноября, 2014 Доброго всем времени суток!Подскажите пожалуйста с таким вопросом: при открытие ордера получаю ошибку ordersend error 130.Ордер открываю по цене как на скриншоте 1.24629. double bl = Ask+200*Point;double sl = Ask-200*Point;double tp = Ask+400*Point; bool resultBUYLIMIT = OrderSend(Symbol(), OP_BUYLIMIT, 0.01, bl, 1, sl, tp);В чём может быть проблема? EURUSDM1.png Ссылка на сообщение Поделиться на другие сайты More sharing options...
chistaia-rodina Опубликовано 20 ноября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 ноября, 2014 Bal, попробуйте нормализовать значения для использования в функции. Пример:double bl = NormalizeDouble(Ask + 200 * Point, Digits); и что-то у вас маловато проскальзывание, да и вообще не хватает параметров в OrderSend. Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 20 ноября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 ноября, 2014 Подскажите пожалуйста с таким вопросом: при открытие ордера получаю ошибку ordersend error 130.В чём может быть проблема?У некоторых брокеров стоплэвел великоват (напр Ф4Ю), нужна проверка. Можно так:double Dist = MathMax(200, MarketInfo(_Symbol,MODE_STOPLEVEL));double bl = NormalizeDouble(Ask+Dist *Point, Digits); Ссылка на сообщение Поделиться на другие сайты More sharing options...
Bal Опубликовано 20 ноября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 ноября, 2014 Bal, попробуйте нормализовать значения для использования в функции.Пример:double bl = NormalizeDouble(Ask + 200 * Point, Digits); и что-то у вас маловато проскальзывание, да и вообще не хватает параметров в OrderSend. Попробовал NormalizeDouble, но без результатов. Проблема в том, что это уже второй мой советник и в первом советнике такой код прекрасно работает даже с меньшим стопам / тейкам. Поэтому эта ситуация меня немного в ступор загнала. Специально даже такой простой код написал для наглядности.У некоторых брокеров стоплэвел великоват (напр Ф4Ю), нужна проверка. Можно так:double Dist = MathMax(200, MarketInfo(_Symbol,MODE_STOPLEVEL));double bl = NormalizeDouble(Ask+Dist *Point, Digits); MarketInfo(Symbol(),MODE_STOPLEVEL)) возвращает 0.Ps. брокер пантеон финанс Ссылка на сообщение Поделиться на другие сайты More sharing options...
chistaia-rodina Опубликовано 20 ноября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 ноября, 2014 Давайте тогда весь код посмотреть и прогнать в тестере, так будет понятнее. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Bal Опубликовано 20 ноября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 ноября, 2014 chistaia-rodinaВ советнике строчка 160, я написал при каких условиях выполнится и как запустить.Для запуска нужен индикатор fractal_dimensionfd.mq4fractal_dimension.mq4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
chistaia-rodina Опубликовано 20 ноября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 ноября, 2014 Bal, что-то покопался немного, сначала полез в дебри, а потом дошло, оказалось всё просто. Так как ордер отложенный, соответственно имеет два направления, в данном случае направление выбрано неверно, по этим расчётам нужно было ставить OP_BUYSTOP. 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Bal Опубликовано 20 ноября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 ноября, 2014 chistaia-rodinaДа, действительно. Благодарю за помощь! :) Ссылка на сообщение Поделиться на другие сайты More sharing options...
websmith Опубликовано 22 ноября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 ноября, 2014 Попытка наложить болинжер на индюк накопления распределения не увенчалась успехом double AD[]; int dim=10000; ArrayResize(AD,dim); for(int bar=0; bar ArraySetAsSeries(AD,true); double AD_LOWER = iBandsOnArray(AD,dim,24,2,0,2,0); double AD_UPPER = iBandsOnArray(AD,dim,24,2,0,1,0); double AD_MAIN = iBandsOnArray(AD,dim,24,2,0,0,0); AD_LOWER, AD_UPPER, AD_MAIN выдают значения, которые не имеют никакого отношения к болинжеру, наложенному на AD.Помогите, пожалуйста, решить проблему. Добавлено: 22-11-2014 07:35:18Нашел ответ, надо было вот так: double AD[]; int dim=10000; ArrayResize(AD,dim); ArraySetAsSeries(AD,true); for(int bar=0; bar double AD_LOWER = iBandsOnArray(AD,dim,24,2,0,2,0); double AD_UPPER = iBandsOnArray(AD,dim,24,2,0,1,0); double AD_MAIN = iBandsOnArray(AD,dim,24,2,0,0,0); Изменено 22 ноября, 2014 пользователем ArmStrong Ссылка на сообщение Поделиться на другие сайты More sharing options...
sadradik Опубликовано 23 ноября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 ноября, 2014 вот ошибки2014.11.23 22:37:51.879 2014.09.01 17:00 unresolved import function call2014.11.23 22:37:51.879 2014.09.01 17:00 Cannot find 'tral' in 'library.ex4'импорт длл разрешен..что делать в чем причина? MetaTrader_4_-_RoboForex.png Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 23 ноября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 ноября, 2014 Сова не находит библиотеку 'library.ex4'. У Вас она есть? Если есть, то должна находиться в папке MQL4\Libraries. Найти эту папку можно через Ваш_терминал/Файл/Открыть каталог данных 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
denis77515 Опубликовано 24 ноября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 24 ноября, 2014 Ребята доброго времени.бьюсь во с какой бедой. работа советника происходит от одного индикатора как открытие ордеров,так и их закрытие. то есть если кто знаком с системой кукловод то вы должны понять что к чему.в общем так условия закрытия таковы Спойлер [if( indi_usd >= 70) Close_Orders_USD();elseif( indi_usd if( indi_usd elseif( indi_usd >= 10) Close_Orders_USD();]В общем пробовал писать условие разным вариантом,все равно работает не правильно.то есть там как я понимаю нужно установить флаг,я попросту не знаю как это сделать.заранее благодарен кто откликнется. Ссылка на сообщение Поделиться на другие сайты More sharing options...
chistaia-rodina Опубликовано 24 ноября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 24 ноября, 2014 denis77515, а какие условия открытия и в чём конкретно проблема, как работает и как должно быть? Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти