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

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

#4676

Посмотрел исправленный код, небо и земля. Есть чему поучится. Спасибо.

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

#4677

Посмотрел исправленный код, небо и земля. Есть чему поучится. Спасибо.


я ничего не менял...
#4678

DoubleToStr Вот этого не было.

#4679


DoubleToStr Вот этого не было.


Да это просто посмотреть в журнале, какие цены сравниваются. На работу никак не влияет...
Ну нет в MQL другого дебагера >:d
#4680

У меня появился вопрос общего характера. Вот я к примеру пишу любой код.
extern int Slippage=3;
extern int MaPeriod=21;
extern int MaShift =3;
extern int TrailingStop= 30;

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

#4681


У меня появился вопрос общего характера. Вот я к примеру пишу любой код.
extern int Slippage=3;
extern int MaPeriod=21;
extern int MaShift =3;
extern int TrailingStop= 30;

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

по-идее ошибку компиляция покажет.. может, зарезервированное слово?
#4682

Да в том и дело, что при компиляции ошибка выйдет и даже не одна. А такая фигня может быть в любом месте когда прописываю параметры,а самое главное, это может быть любое слово (Magic, StopLoss и т.д.).

#4683

Да в том и дело, что при компиляции ошибка выйдет и даже не одна. А такая фигня может быть в любом месте когда прописываю параметры,а самое главное, это может быть любое слово (Magic, StopLoss и т.д.).


Так при компиляции пишет, какая ошибка... Еще MQL чувствителен к регистру знаков. Может, объявляете одну и ту же переменную в разных местах....
Смотреть надо в конкретном случае-что..
#4684


Только зачем это?


Спасибо, задача состоит в том чтобы робот отслеживал сигнал каждый новый день, и если ордер открыт он его контролирует только в день открытия, на след. день он ищет вход для нового ордера и тд
#4685
Viktor M. БУ сетки это уровень, при достижении которого ценой, суммарный PL сетки = 0. Отсюда легко посчитать прибыль.
БУ = Сумма ( Цена_ордера * лот_ордера ) / Сумма ( лот_ордера ). Суммы вычисляются в цикле по всем ордерам сетки - там, где Вы считаете количество ордеров добавляется 2 строчки:
SumLotPrice += OrderLots() * OrderOpenPrice();
SumLot += OrderLots();

После цикла вычисляем БУ сетки:
gridBUprc = SumLotPrice / SumLot;

Данный расчёт нужно делать при изменении количества открытых ордеров (на каждом тике делать не надо). Расчёт будет учитывать даже ордера открытые или закрытые вручную (если с магиком).
#4687

Добрый день.
Возник вопрос с iCustom?
Есть индикатор FL11, как правильно записать параметры iCustom, чтобы красное/синее "солнышко", можно было использовать как фильтр для входа?
uptr = iCustom(NULL, 0, "FL11", 4, 0);
dntr = iCustom(NULL, 0, "FL11", 5, 0);
потом
bool UP_Trend()
{
if(uptr > 0 && uptr != 2147483647.0) return(true);
return(false);
}
bool DN_Trend()
{
if(dntr > 0 && dntr != 2147483647.0) return(true);
return(false);
}
потом условие
if( DN_Trend()==true)
........................

FL11.mq43 скач.

#4688
d1w4m3 Параметры индикатора (все extern) пишутся подряд после названия iCustom(NULL, 0, "FL11", ....... , 4, 0); , строго в порядке их объявления в индикаторе. Если не все параметры хотите писать, то тут правило такое: например из 10 параметров записали первые 4 - значит остальные принимают значение по умолчанию. Не по порядку - нельзя.
ПС: Этот индикатор может перерисовывать (изменять свои значения), так что аккуратнее с ним.
#4689

Спасибо уяснил \M/
Запутался еще в одном деле, закрытие частично ордера по профиту:
if ( CountSell()>0)
{
for(int i = OrdersTotal() -1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
Price = NormalizeDouble(OrderOpenPrice(),Digits);
if (OrderMagicNumber() == Magic && OrderType() == OP_SELL && NormalizeDouble(Ask+Profit*Point,Digits) if(!OrderClose(OrderTicket(), closeLots, Bid, Slippage, Black))
Print("Ошибка");
}
}
}
где ордер открыт Lots=0,3
closeLots=0.1
Закрывает весь ордер?


Добавлено: 13-07-2017 10:30:25

Увидел проблему((он закрывает 3 раза по 0.1, только понять как избежать этого не догоняю((или надо отдохнуть

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

#4690

Увидел проблему((он закрывает 3 раза по 0.1, только понять как избежать этого не догоняю((или надо отдохнуть

После частичного закрытия нужно увеличить Profit для оставшегося ордера, да и подтянуть СЛ не помешает...
#4691

0ll спасибо за подсказки. Буду мучить компилятор - не боги ж горшки обжигают? Не солидно как-то.

#4692


Увидел проблему((он закрывает 3 раза по 0.1, только понять как избежать этого не догоняю((или надо отдохнуть

После частичного закрытия нужно увеличить Profit для оставшегося ордера, да и подтянуть СЛ не помешает...

Извиняюсь, но нельзя ли мне как тугодуму объяснить, где тут покопать, а где тут просверлить ^:)^)))а то что то совсем заплутал
#4693


У меня появился вопрос общего характера. Вот я к примеру пишу любой код.
extern int Slippage=3;
extern int MaPeriod=21;
extern int MaShift =3;
extern int TrailingStop= 30;

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



Конкретно в этом куске ошибок нет. Возможно, в последующем, когда Вы используете эти объявленные переменные в коде и путаете тип данных (объявлен как int, а используете как double), то редактор может не подсвечивать такие переменные. Ну или банальная опечатка.
#4694



Увидел проблему((он закрывает 3 раза по 0.1, только понять как избежать этого не догоняю((или надо отдохнуть

После частичного закрытия нужно увеличить Profit для оставшегося ордера, да и подтянуть СЛ не помешает...
Извиняюсь, но нельзя ли мне как тугодуму объяснить, где тут покопать, а где тут просверлить ^:)^)))а то что то совсем заплутал
В вашем коде есть условие выбора ордера:
if (OrderMagicNumber() == Magic && OrderType() == OP_SELL && NormalizeDouble(Ask+Profit*Point,Digits)в условии есть дистанция Profit. За первый проход цикла все ордера частично закрываются, но на следующем проходе цикла словие срабатывает снова и за 3 приёма закрывает всё. Чтоб работало корректно, после первого прохода надо увеличивать ожидаемый профит у оставшейся части ордеров - либо Profit, либо пересчитать Price.

Viktor M. почитайте эту тему
#4695

Спасибо, но это я понимаю, вопрос в том?
Мне опять надо открывать цикл после функции OrderClose()?Чтобы найти получившийся ордер или тикет сохраняется?

#4696


Спасибо, но это я понимаю, вопрос в том?
Мне опять надо открывать цикл после функции OrderClose()?Чтобы найти получившийся ордер или тикет сохраняется?

Тикет меняется, а зачем искать получившийся ордер?
Вы в цикле частично закрываете все ордера по выбранному направлению, после цикла меняете цель профита и всё.
#4697



Спасибо, но это я понимаю, вопрос в том?
Мне опять надо открывать цикл после функции OrderClose()?Чтобы найти получившийся ордер или тикет сохраняется?

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

if ( CountSell()>0 && NormalizeDouble(Ask+Profit*Point,Digits) {
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(), closeLots, Bid, Slippage, Black))
{
if(!OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()+SL, OrderOpenPrice()-TP1, 0))
Print("Ошибка ");
}
}
}
}
Что то я упускаю походу((
#4698

Что то я упускаю походу((

Там где OrderModify меняйте условие выбора ордеров, т.е. переменные Profit или Price!!! - эти переменные отвечают за отработку условия частичного закрытия, я не знаю как они вычисляются, но их надо менять!
ПС: задавайте новый ТП и СЛ от текущей цены! а то приведёт к ошибке!
#4699

if ( CountSell()>0 && NormalizeDouble(Ask+Profit*Point,Digits) {
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(), closeLots, Bid, Slippage, Black))
Price = NormalizeDouble(OrderOpenPrice(),Digits)-NormalizeDouble(Ask+Profit*Point,Digits);
{
if(!OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), Price-TP, 0))
Print("Ошибка ");
}
}
}
}
Спасибо :d

#4700

Уважаемые Гуру MQL! Помогите пожалуйста вшить в советник работу в определенный день недели!. Например: понедельник -1, вторник-2, среда-3 и т.д. Благодарю за помощь!

Exp_Ex-_Открытие_позиций_по_времени.ex41 скач.

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

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