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

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


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

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

Предлагаю (прошу) сделать обзор/описание библиотеки MT4Orders. В ней действительно реализованы механизмы мультиплатформенности.

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

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

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

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

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

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

Перейти

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

Перейти

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

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


Всем здравствуйте! Помогите пожалуйста, не пойму ошибку!


Тестер говорит что переменная уже глобально объявлена выше.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Из лички.

Цитата


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


1.) Привет. Всегда проверяй какие данные поставляет тебе источник. iCustom.mq4 и тестер индикаторов тебе в помощь.
Источник нам дает 0 как отсутствие сигнала и 1,3254 как сигнал.

2.)
if(EMA_Hone != EMPTY_VALUE && EMA_Htwo != EMPTY_VALUE)

0 равен EMPTY_VALUE(2147483647)? нет!
1,3254 равен EMPTY_VALUE(2147483647)? нет! Такое условие всегда будет верным и пропускать.

исправляем на
if(EMA_Hone != 0 && EMA_Htwo != 0)

Работает.

Да! этот индикатор есть скользящая средняя, сглаживание EMA по ценам CLOSE.

iCustom.mq4

Изменено пользователем MikR0ReR
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте.
При тестировании своего советника в тестере стратегий у меня возникло недопонимание одного момента со спредом.
Например, для ордера Buy я рассчитываю SL в советнике по формуле
SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
При проверке на демо-счете все работает корректно при закрытие сделки по стопу. А при проверке в тестере убыток увеличиваетя на размер некого фиксированного спреда. Причем настройки в поле "Спред" в тестере ничего не дают, результат не меняется.
Аналогично фин. результат сделки при закрытии по TP так же отличается на Демо и в тестере на тотже самьй спред.
Я не так давно пользуюсь тестером.
Подскажите, пожалуйста, что я делаю не так?

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

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

Подскажите, пожалуйста, что я делаю не так?


Попробуй как вариант модифицировать ордер уже после открытия. На ECN типе счетов выставлять ТП/СЛ сразу нельзя, насколько я помню.
Т.е. уже после открытия ордера бери цену его открытия от нее выставляй цели:
            int ticket = (int)OrderSend(_Symbol, op, Lot, Ask, slippage, 0, 0, EAName, MagicNumber, 0, clrBlue);
if(ticket else {
if(OrderSelect(ticket,SELECT_BY_TICKET) {
double tp = NormalizeDouble(OrderOpenPrice() + TakeProfit*Point, Digits);
double sl = NormalizeDouble(OrderOpenPrice() - StopLoss*Point, Digits);
if(!OrderModify(ticket, OrderOpenPrice(), sl, tp, 0)) Print("Ошибка модификации ордера");
}
}


Возможно у тебя разница до целей возникает из-за проскальзывания и времени между выставлением ордера и модификацией - вначале Ask был один, потом стал другой.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

проблема с CountSell().
подсчет открытых позиций на реале порой дает сбой. "успевает" открыть две позиции в место одной. может конечно на оборот и "не успевает" просчитать, но думаю ошибка в чем то этаком.
подскажите пожалуйста как стабилизировать эту функцию:
int CountSell()
{
int count = 0;
for(int trade=OrdersTotal()-1; trade>=0; trade--)
{
if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic &&
OrderType()==OP_SELL)
count++;
}}
return(count) ;
}

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

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

проблема с CountSell().
подсчет открытых позиций на реале порой дает сбой. "успевает" открыть две позиции в место одной

Проблема не в функции, а в общей логике.
Ссылка на сообщение
Поделиться на другие сайты

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

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




Я так и делаю с модификацией.
И на демо все работает четко. SL выставляется ровно 10 пунктов, убыток при лоте 0.1 - 10$.
Но при запуске в тестере стратегий убыток получается - 10,5$, хотя SL также выставлется ровно на 10 пунктов, те при расчете убытка в $ добавляется еще и спред.
Вопросы:
Так и должно быть?
Как убрать этот спред? Я меняю его в настойках тестера в поле "спред", но ничего не менется, убыток по прежнему 10,5 при любом значении в поле "спред".


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

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

"Как убрать этот спред? Я меняю его в настойках тестера в поле "спред", но ничего не менется, убыток по прежнему 10,5 при любом значении в поле "спред"."

- а ты, именно ноль вписывал в окне спреда?
- имею другой вопрос к TralingStop:
параметр шаг/step начинается только после достижения без убытка заданного параметром stoploss. то есть первый step = размеру stoploss.
- а хотелось бы что бы TralingStop сразу начинался по заданному шагу.
- как?

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

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

Но при запуске в тестере стратегий убыток получается - 10,5$, хотя SL также выставлется ровно на 10 пунктов, те при расчете убытка в $ добавляется еще и спред.

Возможно из-за другой стоимости пункта - зависит от валюты счёта и валют пары теста. Проверьте комиссию. Демо и тестер на одном счёте?

имею другой вопрос к TralingStop:
параметр шаг/step начинается только после достижения без убытка заданного параметром stoploss. то есть первый step = размеру stoploss.
- а хотелось бы что бы TralingStop сразу начинался по заданному шагу.

Трал может включаться сразу после открытия ордера или некого уровня просадки - вопрос алгоритма. Вы готовы заранее задать условие включения трала если сделка ушла в минус на 10$ или на 20$? Поэтому проще определить БУ ордера как точку срабатывания условия включения трала.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


Но при запуске в тестере стратегий убыток получается - 10,5$, хотя SL также выставлется ровно на 10 пунктов, те при расчете убытка в $ добавляется еще и спред.

Возможно из-за другой стоимости пункта - зависит от валюты счёта и валют пары теста. Проверьте комиссию. Демо и тестер на одном счёте?

Спасибо. Разобралась) Это не спред, а комиссия (счет ECN), я совсем про нее забыла ;) На демо финрезультат и комиссия показываются отдельно, а в тестере они суммируются. Изменено пользователем 0ll
Ссылка на сообщение
Поделиться на другие сайты

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

Вы готовы заранее задать условие включения трала если сделка ушла в минус на 10$ или на 20$?


ну скажем так, я хотел бы попробовать такое условия срабатывания трала(сразу). запустить на тесте и проверить. потом поразмышлять над результатом.
я так понимаю речь идет об изменении этого условия:
...
if(OrderStopLoss() {
if(!OrderModify...

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

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

я так понимаю речь идет об изменении этого условия:

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

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

Включается трал в месте вызова функции.


в месте вызова, какой функции:OrderModify(), или там где запускаетсяTrailing() ? Изменено пользователем Ar4i
Ссылка на сообщение
Поделиться на другие сайты

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

функции трала. Ar4i Вы свой код показываете кусочками и хотите помощи...

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

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

функции трала. Ar4i Вы свой код показываете кусочками и хотите помощи...


понял. исправляюсь:
Спойлер

//----------------------
void Trailing()
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) &&
OrderSymbol() == Symbol() &&
OrderMagicNumber()== Magic)
{
//--------------------
if(OrderType() == OP_BUY)
{
last_type = OP_BUY;

if(Bid-OrderOpenPrice() > TralingStop *Point || OrderStopLoss()==0)
{
if(OrderStopLoss() {
TP = NormalizeDouble(OrderOpenPrice() + TakeProfit*Point, Digits);
if(!OrderModifyX(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TralingStop *Point, Digits), TP, 0, Red))
Print ("Trailing(): Ошибка! модификации ордера на buy");
}}}
//-----------------
if(OrderType() == OP_SELL)
{
last_type = OP_SELL;

if(OrderOpenPrice()-Ask > TralingStop *Point || OrderStopLoss()==0)
{
if(OrderStopLoss() > Ask+(TralingStep + TralingStop)*Point || OrderStopLoss()==0)
{
TP = NormalizeDouble(OrderOpenPrice() - TakeProfit *Point, Digits);
if(!OrderModifyX(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask + TralingStop *Point, Digits), TP, 0, Red))
Print ("Trailing(): Ошибка! модификации ордера на sell");
}}}
} // if(OrderSelect..

}// for..

} //end
//----------------------


ну и уже соответственно в нужном мне контексте вставляю: Trailing().
Изменено пользователем 0ll
Ссылка на сообщение
Поделиться на другие сайты

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

понял. исправляюсь:
ну и уже соответственно в нужном мне контексте вставляю: Trailing().

fcplm я и веду речь о том, что не вижу кода места вызова функции Trailing(). Там должно условие какое-то быть...
Ссылка на сообщение
Поделиться на другие сайты

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

if(PriceHigh_2 >= PriceHigh)
{

//-----------------------------close sell
if(CountSell() > 0)
{
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(), Ask, Slippadge, Black )== true)
Print("Закрытие на sell №" + IntegerToString(OrderTicket(), 1, ' '));

}}}
//-------------------------------open buy
if(CountSell()==0 && CountBay()==0 && last_type != OP_BUY)
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippadge, 0, 0,"OrderSend", Magic, Blue);
if(ticket > 0)
{
Print("Открытие сделки №" + IntegerToString(aticket, 1, ' '));
} else Print("error of opening order on buy");
}
Trailing();
}
//-------------------------------------------------------
правда не понимаю какое значение это может имеет к самому интересующему меня моменту алгоритма самой функции Trailing().

Изменено пользователем Ar4i
Ссылка на сообщение
Поделиться на другие сайты

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

правда не понимаю какое значение это может имеет к самому интересующему меня моменту алгоритма самой функции Trailing().

У Вас Трал включается только при условии на вход, т.е. максимум 1 раз за свечу - поэтому не работает.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

В чём суть-то?


есть функция:
Спойлер

//----------------
void Trailing()
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) &&
OrderSymbol() == Symbol() &&
OrderMagicNumber()== Magic)
{
if(OrderType() == OP_BUY)
{
last_type = OP_BUY;
if(Ask-OrderOpenPrice() > TralingStop *Point || OrderStopLoss()==0)
{
if(OrderStopLoss() {
TP = NormalizeDouble(OrderOpenPrice() + TakeProfit*Point, Digits);
if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask-TralingStop *Point, Digits), TP, 0, Red))
Print ("Ошибка! модификации ордера на buy");
}}}
if(OrderType() == OP_SELL)
{
last_type = OP_SELL;
if(OrderOpenPrice()-Bid > TralingStop *Point || OrderStopLoss()==0)
{
if(OrderStopLoss() > Bid+(TralingStep + TralingStop)*Point || OrderStopLoss()==0)
{
TP = NormalizeDouble(OrderOpenPrice() - TakeProfit *Point, Digits);
if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid + TralingStop *Point, Digits), TP, 0, Red))
Print ( Ошибка! модификации ордера на sell");
}}}}}}

//----------------


в ней есть параметры TralingStop и TralingStep.
так вот, срабатывание заданного шага(TralingStep) в этой функции происходит ТОЛЬ ПОСЛЕ ПЕРВОГО ШАГА равному всегда TralingStop(линии без убытка), а уже последующие шаги совершаются равные TralingStep.
хочется получить, что бы ПЕРВЫЙ ШАГ был тоже равен TralingStep. Изменено пользователем 0ll
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Войти

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

Войти

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


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

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