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

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

#1576

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

#1577


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



если указать данные функции в последовательности - сначала закрыть бай а потом селл. закрытие будет проходить в такой же последовательности?
#1578
Спойлер



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



если указать данные функции в последовательности - сначала закрыть бай а потом селл. закрытие будет проходить в такой же последовательности?


Короче догнал что именно пытаетесь спросить, исполнение кода идёт слева на право и сверху вниз, плюс правило скобок как в математике по условиям. Соответственно если будут прописаны две функции подряд без каких либо разграничений, то они так и исполнятся, сначала верхняя, а потом сразу же следующая снизу.
#1579


Спойлер



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



если указать данные функции в последовательности - сначала закрыть бай а потом селл. закрытие будет проходить в такой же последовательности?


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



=d> спасибо.
#1580

А подскажите, как сделать выпадающее меню во внешних настройках?
то есть, например, MM = true/false

#1581


А подскажите, как сделать выпадающее меню во внешних настройках?
то есть, например, MM = true/false

Читай
#1582



А подскажите, как сделать выпадающее меню во внешних настройках?
то есть, например, 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);
}



будет искать лоты только для своего советника?
То есть, если на одном счете два эксперта, эта функция найдет последний лот своего?

Изменено 18 ноября, 2014 пользователем oleguitar

#1583


будет искать лоты только для своего советника?
То есть, если на одном счете два эксперта, эта функция найдет последний лот своего?

Магики разные (про символ умолчу), значит и ордера разные.
Вам надо подумать о досрочном выходе из цикла - при тестировании/работе будет зависать (при большой истории закрытых сделок). Досрочный выход, например, если с даты закрытия ордера прошло более месяца...
Можно сохранять лот последнего ордера в переменную (глобальную или статик) и брать его для расчётов нового без всякого поиска по истории, а при открытии нового ордера - переписывать.
#1584

Ну у меня эта функция редко вызывается, тестирование нормально проходит, без тормозов

Вот над этим еще думаю:
как бы закрыть ордер, если он старше H часов и его убыток не больше N пунктов, часто ведь бывает, что если сделка затягивается - ничего хорошего может не быть, тем более как у меня , средняя сделка 4 часа, и те, которые старше 1 дня, как правило, убыточные
Нужно наверное сравнить дату закрытия с текущей, только непонятно, с чем сравнивать(if( date_current-date_last)> ??? )
и Найти момент закрытия последней сделки, и записать баланс в стат. переменную, и во время сделки, продолжительностью более 1 дня, сравнивать с балансом текущим, и если он не меньше предыдущего, чем X пунктов или процентов, то закрываем.

Так примерно или проще можно сделать? :-?

#1585


Так примерно или проще можно сделать? :-?

Значительно проще.
В той функции, где идёт пересчёт ордеров и вычисляется профит, добавляете пару строк:

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) - читай справку, или сам вычисляй цену закрытия.
#1586

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);
}
}

#1587


1) -10 - в пунктах, как я понимаю?
2)А если вот так?

1. Только если у Вас OrderProfit() выдаёт значение в пунктах... У меня в валюте депозита.
2. Отлично.
#1588

Доброго всем времени суток!
Подскажите пожалуйста с таким вопросом: при открытие ордера получаю ошибку 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

#1589
Bal, попробуйте нормализовать значения для использования в функции.

Пример:

double bl = NormalizeDouble(Ask + 200 * Point, Digits);

и что-то у вас маловато проскальзывание, да и вообще не хватает параметров в OrderSend.
#1590


Подскажите пожалуйста с таким вопросом: при открытие ордера получаю ошибку ordersend error 130.
В чём может быть проблема?

У некоторых брокеров стоплэвел великоват (напр Ф4Ю), нужна проверка. Можно так:

double Dist = MathMax(200, MarketInfo(_Symbol,MODE_STOPLEVEL));
double bl = NormalizeDouble(Ask+Dist *Point, Digits);
#1591


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. брокер пантеон финанс
#1592

Давайте тогда весь код посмотреть и прогнать в тестере, так будет понятнее.

#1593
chistaia-rodina

В советнике строчка 160, я написал при каких условиях выполнится и как запустить.
Для запуска нужен индикатор fractal_dimension

fd.mq411 скач.
fractal_dimension.mq411 скач.

#1594
Bal, что-то покопался немного, сначала полез в дебри, а потом дошло, оказалось всё просто. Так как ордер отложенный, соответственно имеет два направления, в данном случае направление выбрано неверно, по этим расчётам нужно было ставить OP_BUYSTOP.
#1595
chistaia-rodina
Да, действительно. Благодарю за помощь! :)
#1596

Попытка наложить болинжер на индюк накопления распределения не увенчалась успехом


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

#1597

вот ошибки
2014.11.23 22:37:51.879 2014.09.01 17:00 unresolved import function call
2014.11.23 22:37:51.879 2014.09.01 17:00 Cannot find 'tral' in 'library.ex4'

импорт длл разрешен..
что делать в чем причина?

MetaTrader_4_-_RoboForex.png

#1598

Сова не находит библиотеку 'library.ex4'. У Вас она есть? Если есть, то должна находиться в папке MQL4\Libraries.
Найти эту папку можно через Ваш_терминал/Файл/Открыть каталог данных

#1599

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

Спойлер

[
if( indi_usd >= 70) Close_Orders_USD();
else
if( indi_usd
if( indi_usd else
if( indi_usd >= 10) Close_Orders_USD();
]
В общем пробовал писать условие разным вариантом,все равно работает не правильно.то есть там как я понимаю нужно установить флаг,я попросту не знаю как это сделать.заранее благодарен кто откликнется.

#1600
denis77515, а какие условия открытия и в чём конкретно проблема, как работает и как должно быть?

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

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