Перейти к содержанию

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


Рекомендуемые сообщения

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

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

Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано


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



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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Спойлер



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



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


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

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


Спойлер



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



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


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



=d> спасибо.
Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

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


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

Читай
Ссылка на сообщение
Поделиться на другие сайты

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



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



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

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


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

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

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

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

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

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

Ссылка на сообщение
Поделиться на другие сайты

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


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

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

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) - читай справку, или сам вычисляй цену закрытия.
Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

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


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

1. Только если у Вас OrderProfit() выдаёт значение в пунктах... У меня в валюте депозита.
2. Отлично.
Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Bal, попробуйте нормализовать значения для использования в функции.

Пример:

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

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

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


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

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

double Dist = MathMax(200, MarketInfo(_Symbol,MODE_STOPLEVEL));
double bl = NormalizeDouble(Ask+Dist *Point, Digits);
Ссылка на сообщение
Поделиться на другие сайты

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


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. брокер пантеон финанс
Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
chistaia-rodina

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

fd.mq4
fractal_dimension.mq4

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Bal, что-то покопался немного, сначала полез в дебри, а потом дошло, оказалось всё просто. Так как ордер отложенный, соответственно имеет два направления, в данном случае направление выбрано неверно, по этим расчётам нужно было ставить OP_BUYSTOP.
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

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


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);
Изменено пользователем ArmStrong
Ссылка на сообщение
Поделиться на другие сайты

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

вот ошибки
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

Ссылка на сообщение
Поделиться на другие сайты

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

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

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

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

Спойлер

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

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
denis77515, а какие условия открытия и в чём конкретно проблема, как работает и как должно быть?
Ссылка на сообщение
Поделиться на другие сайты

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

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...