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

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


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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Шурик, особо другие функции не проверял и код не буду выкладывать, потому как помарка незначительная, сами поправите. Я же уже обращал на это внимание, но вы видимо как-то пропустили. В функции TotalProfit(), после выбора ордера должно стоять или (||).
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Перейти

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

Перейти

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

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


Шурик, особо другие функции не проверял и код не буду выкладывать, потому как помарка незначительная, сами поправите. Я же уже обращал на это внимание, но вы видимо как-то пропустили. В функции TotalProfit(), после выбора ордера должно стоять или (||).



Я Вам бесконечно благодарен, именно после этого изменения все заработало, Спасибо!!!
Ссылка на сообщение
Поделиться на другие сайты

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

Всем привет!
Возможно-ли рассчитать в советнике стоимость одного пункта, если счет будет открыт в рублях?

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

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


Всем привет!
Возможно-ли рассчитать в советнике стоимость одного пункта, если счет будет открыт в рублях?



Точно не знаю, у самого как-то не возникало необходимости, но похоже надо смотреть справку по функции MarketInfo и вероятно то что вам нужно, это:

MarketInfo(Symbol(), MODE_TICKVALUE);
Ссылка на сообщение
Поделиться на другие сайты

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



Всем привет!
Возможно-ли рассчитать в советнике стоимость одного пункта, если счет будет открыт в рублях?



Точно не знаю, у самого как-то не возникало необходимости, но похоже надо смотреть справку по функции MarketInfo и вероятно то что вам нужно, это:

MarketInfo(Symbol(), MODE_TICKVALUE);


т.е. если лот*MarketInfo(Symbol(), MODE_TICKVALUE) то получится стоимость в валюте депо?
Ссылка на сообщение
Поделиться на другие сайты

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

Точно не уверен, возможно нужно ещё что-то добавить. Попробуйте напишите и протестируйте.

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

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


Точно не уверен, возможно нужно ещё что-то добавить. Попробуйте напишите и протестируйте.



например: открыты несколько ордеров на покупку и несколько на продажу.
если посчитать профит отдельно для покупок и отдельно для продажи следующими функциями:
double profit_buy()
{
profit_b = 0;
for (int i=OrdersTotal()-1; i>=0;i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
profit_b += OrderProfit()+MathAbs(OrderSwap())+OrderCommission();
}
}
return (NormalizeDouble(profit_b,2));
}
//----------------------------------------------------------------------------------------------------------------------------------------------------------

double profit_sell()
{
profit_s = 0;
for (int i=OrdersTotal()-1; i>=0;i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
profit_s += OrderProfit()+MathAbs(OrderSwap())+OrderCommission();
}
}
return (NormalizeDouble(profit_s,2));
}

и задать условие, что если profit_buy()+profit_sell()>0 и использовать функцию закрытия ордеров:

void ClosePlusOrders()
{
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY)
{
if (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), Slippage, Blue))
{
Print ("Ордер на покупку закрыт");
}
else Print ("Ордер на покупку не закрыт");
}
if (OrderType() == OP_SELL)
{
if (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), Slippage, Red))
{
Print ("Ордер на продажу закрыт");
}
else Print ("Ордер на продажу не закрыт");
}
}
}
}
}
то все ордера будут закрыты при выполнении условия?

Добавлено: 17-10-2014 19:30:06


Точно не уверен, возможно нужно ещё что-то добавить. Попробуйте напишите и протестируйте.



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

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


пробовал, в тестере закрывает в плюс. есть сомнения, что на реале не будет закрываться в плюс, т.к. текущая стоимость пункта будет меняться в зависимости от курса доллара. так ли это?

Причём здесь стоимость пункта? если Вы закрываете суммарный профит по ордерам! тем более они залокированы. Профит может измениться только за счёт проскальзывания на закрытии.
Стоимость пункта используют при расчете дистанции до ТР (например) или расчете лота при известном СЛ.
А у Вас уже есть профит - ничего рассчитывать не надо - просто фиксировать.
Кстати функция MarketInfo(_Symbol,MODE_TICKVALUE) возвращает стоимость 1 минимального пункта в валюте депозита для сделки в 1 лот (стандартный лот брокера).
Ссылка на сообщение
Поделиться на другие сайты

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



пробовал, в тестере закрывает в плюс. есть сомнения, что на реале не будет закрываться в плюс, т.к. текущая стоимость пункта будет меняться в зависимости от курса доллара. так ли это?

Причём здесь стоимость пункта? если Вы закрываете суммарный профит по ордерам! тем более они залокированы.
Стоимость пункта используют при расчете дистанции до ТР (например) или расчете лота при известном СЛ.
А у Вас уже есть профит - ничего рассчитывать не надо - просто фиксировать.
Кстати функция MarketInfo(_Symbol,MODE_TICKVALUE) возвращает стоимость 1 минимального пункта в валюте депозита для сделки в 1 лот (стандартный лот брокера).


так если объем (=0.01 лота) *MarketInfo(_Symbol,MODE_TICKVALUE) это разве не будет равно стоимости одного пункта (при объеме 0.01)?
Ссылка на сообщение
Поделиться на другие сайты

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


так если объем (=0.01 лота) *MarketInfo(_Symbol,MODE_TICKVALUE) это разве не будет равно стоимости одного пункта (при объеме 0.01)?

Да, уж... Т.к. этот раздел - обучение, будем обучать математике:
1 лот * 1 пп = TICKVALUE, теперь умножим - 0,01 лот * 1 лот * 1 пп = 0,01 лот * TICKVALUE или проще говоря: 0,01 лот * 1 пп = 0,01 лот * TICKVALUE. Ура.
Ссылка на сообщение
Поделиться на другие сайты

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



так если объем (=0.01 лота) *MarketInfo(_Symbol,MODE_TICKVALUE) это разве не будет равно стоимости одного пункта (при объеме 0.01)?

Да, уж... Т.к. этот раздел - обучение, будем обучать математике:
1 лот * 1 пп = TICKVALUE, теперь умножим - 0,01 лот * 1 лот * 1 пп = 0,01 лот * TICKVALUE или проще говоря: 0,01 лот * 1 пп = 0,01 лот * TICKVALUE. Ура.

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

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

Добрый день, пытаюсь создать переменную, содержащую в себе среднее значение (H-L) для n кол-ва баров
то есть:

Спойлер

high1 = High[ 1 ];
high2 = High[ 2 ];
high3 = High[ 3 ];

low1 = Low[ 1 ];
low2 = Low[ 2 ];
low3 = Low[ 3 ];

range1 = (high1 - low1)
range2 = (high2 - low2);
range3 = (high3 - low3);

Average = (range1 + range2 + range3)/3;



когда у нас рассматривается три бара, это еще ничего, но а если нужно 200 или 500, то как быть? x_x
Вроде нужно массив создать для range, но как суммировать значения потом...

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

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

Подскажите, как прописать условие: если закрылся хоть один ордер, то закрыть все остальные. Или - если закрылись все бай, то закрыть все селл. (у меня все профиты бай на одной цене и все профиты селл тоже)??? ~x(

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

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


Добрый день, пытаюсь создать переменную, содержащую в себе среднее значение (H-L) для n кол-ва баров

Вы рассматриваете вариант SMA, можно применить EMA - экспоненциальную среднюю - она менее ресурсо-требовательная.
например: int ema_Count = 500; //баров
double kf_ema = 1.0 / ema_Count;
double ema;
если бар закрылся:
ema = kf_ema * (High[1] - Low[1]) + (1-kf_ema) * ema; //это оно и есть.
Хочу предупредить: ЕМА не сразу выдаст нужное значение, а только через 500 бар, чтоб ускорить процесс нужно при запуске эксперта всё-таки разово вычислять SMA и присваивать его в качестве начального значения для ema.
Если хотите ещё вариантов, то откройте в редакторе МТ индюк iMA - там очень грамотный код.


Подскажите, как прописать условие: если закрылся хоть один ордер, то закрыть все остальные. Или - если закрылись все бай, то закрыть все селл. (у меня все профиты бай на одной цене и все профиты селл тоже)??? ~x(

Самый простой способ это запоминать кол-во ордеров в другой переменной, потом после нового подсчёта сравнивать старое и новое значение и принимать решение если ордеров стало меньше. Минус этого варианта - Вы не будете знать ТР или СЛ закрыли ордер. Если это важно, то вместе со значением кол-ва ордеров надо сохранять текущий общий профит и если профит растёт и ордер закрылся, то закрывать все остальные.
Есть способ через контроль закрытых ордеров, он точнее, но значительно сложнее. Изменено пользователем 0ll
Ссылка на сообщение
Поделиться на другие сайты

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


Самый простой способ это запоминать кол-во ордеров в другой переменной, потом после нового подсчёта сравнивать старое и новое значение и принимать решение если ордеров стало меньше. Минус этого варианта - Вы не будете знать ТР или СЛ закрыли ордер. Если это важно, то вместе со значением кол-ва ордеров надо сохранять текущий общий профит и если профит растёт и ордер закрылся, то закрывать все остальные.
Есть способ через контроль закрытых ордеров, он точнее, но значительно сложнее.



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

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


а как первый вариант прописать на языке MQL? У меня есть функция подсчета рыночных ордеров, как ее сравнить с ней же но тиком раньше?

int Сколько_сейчас = ordCount();
if (Сколько_сейчас Было_раньше = Сколько_сейчас;
Ссылка на сообщение
Поделиться на другие сайты

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

А помогите разобраться с индикатором
Нашел на сайте индикатор Ozymandis (_http://tlap.com/forum/indikatory/7/indikator-ozymandias-borba-s-rynochnym-shumom/5792)
Там 5 буферов, с верхней и нижней линией понятно, но вот как раз основная вызывает вопросы...
Как проверять ее значение? не понятно, меняет ли центральная линия цвет или это две разные линии и как записать ее в переменную и с чем сравнивать?
Я предположил, что это две разные линии, буфера которых возвращают значения 0 или 1

bool ozy_sell = iCustom(Symbol(), 0, "Ozymandias", Amplitude, 2,0);
bool ozy_buy = iCustom(Symbol(), 0, "Ozymandias", Amplitude, 3,0);

Но я ошибся.

Помогите разобраться с ним, пожалуйста(индикатор в аттаче)

Ozymandias.rar

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

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


А помогите разобраться с индикатором
Нашел на сайте индикатор Ozymandis (_http://tlap.com/forum/indikatory/7/indikator-ozymandias-borba-s-rynochnym-shumom/5792)
Там 5 буферов, с верхней и нижней линией понятно, но вот как раз основная вызывает вопросы...
Как проверять ее значение? не понятно, меняет ли центральная линия цвет или это две разные линии и как записать ее в переменную и с чем сравнивать?
Я предположил, что это две разные линии, буфера которых возвращают значения 0 или 1

bool ozy_sell = iCustom(Symbol(), 0, "Ozymandias", Amplitude, 2,0);
bool ozy_buy = iCustom(Symbol(), 0, "Ozymandias", Amplitude, 3,0);

Но я ошибся.

Помогите разобраться с ним, пожалуйста(индикатор в аттаче)



По всей видимости Вы так и не разобрались и с верхней и нижней линиями. В Вашем варианте Вы как раз и используете 2 и 3 буферы, что для канала. Основная линия строится по значениям буферов 0 и 1, по ним же и расцветка. Замените свои 2 и 3 на 0 и 1. Проверить какому буферу соответствует та или иная линия - измените цвет (толщину, тип) линии данного буфера и смотрите где произойдут изменения. Но помните, что в моменты перехода между цветами сигнал будет в обеих буферах. Убедится в этом Вы можете открыв окно данных. Хотя, все зависит от Ваших условий. Можно использовать только один буфер - 4, у него наличие сигнала "1" - это будет селл, а пустое значение - бай.

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

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

Поменял, все равно не работает... проверяю в условии если ozy_buy>0, подставлял 0, 1, 4 буфера
без условия ozy_buy>0 ордера открываются

Спойлер


void OnTick()
{

bool ozy_sell = iCustom(Symbol(), 0, "Ozymandias", Amplitude, 2,0);
bool ozy_buy = iCustom(Symbol(), 0, "Ozymandias", Amplitude, 4,0);

if (ozy_buy>0 && CountBuy() == 0 && CountSell() == 0)

{
SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);

ticket = OrderSendX(Symbol(), OP_SELL, Lot, Bid, Slippage, 0, 0, "", Magic, 0, Red);

if (ticket > 0)
{
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModifyX(ticket, OrderOpenPrice(), SL, TP, 0);
}
}


}

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
oleguitar Почему не работает - потому, что индюк не считает 0 бар.
Вам нужно принты ставить и смотреть в журнал. Сделайте так:
int ozyDir = (int)iCustom(_Symbol, 0, "Ozymandias", Amplitude, 4, 1);
if (ozyDir == OP_SELL && ... и далее по Вашему тексту (имхо так будет понятнее Dir - от слова "директ"-направление)
Ссылка на сообщение
Поделиться на другие сайты

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


oleguitar Почему не работает - потому, что индюк не считает 0 бар.
Вам нужно принты ставить и смотреть в журнал. Сделайте так:
int ozyDir = (int)iCustom(_Symbol, 0, "Ozymandias", Amplitude, 4, 1);
if (ozyDir == OP_SELL && ... и далее по Вашему тексту (имхо так будет понятнее Dir - от слова "директ"-направление)



тогда уж дирекшн :)

Спасибо, заработало) Не думал, что буфер может содержать в себе понятия BUY и SELL, я представлял себе буфер переменной типа bool содержащей в себе 0 или 1 )
Ссылка на сообщение
Поделиться на другие сайты

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


Не думал, что буфер может содержать в себе понятия BUY и SELL, я представлял себе буфер переменной типа bool содержащей в себе 0 или 1 )

0 и 1 можно представлять по разному, например:
OP_BUY 0 Покупка, OP_SELL 1 Продажа
или false 0, true 1
и ещё куча вариантов, но в данном случае нужно делать через константы свойства ордеров - нагляднее.
Ссылка на сообщение
Поделиться на другие сайты

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

Люди, здрассте, очередной вопрос от начинающего. Хочу написать индикатор, который будет подсвечивать сетап внутренний бар. То есть, если хай и лоу бара ниже и выше (соответственно) предыдущего бара, то меняем его цвет на сигнальный. Гуру, помогите.

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

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

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

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

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

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

Войти

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

Войти

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


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

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