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

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


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

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



так если Orderswap будет с минусом, он уменьшит общий профит? Чтобы компенсировать отрицательный СВОП можно ли его сделать MathAbs(OrderSwap())???

Да, отрицательный своп уменьшает профит.
Компенсируют обычно так: хотим заработать 15$ и закрыться - считаем профит с комис и свопом и когда получили 15 - закрываем (чистая прибыль в этот момент была больше, но она компенсировала своп и комиссию) Если Вы придумали другую логику - вперёд - ограничений нет... и, конечно, MathAbs(OrderSwap()) будет работать - куда ему деваться.


Спасибо за коммент.

Добавлено: 09-10-2014 09:12:49

Всем привет!
Нужна помощь в определении максимальной цены ордеров (ордера на покупку ) и минимальной цены (для ордеров на продажу).
прошу помощь, т.к. не хватает ... ~x( :(( Изменено пользователем Crik1978
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Перейти

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

Перейти

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

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


Нужна помощь в определении максимальной цены ордеров (ордера на покупку ) и минимальной цены (для ордеров на продажу).

Там где у Вас есть цикл по всем ордерам делаете:
double MaxPrc = 0, MinPrc = 9999999; - глобальные переменные

MaxPrc = 0; MinPrc = 9999999; // задаём начальные значения
for(int i = 0 ....)
{
....
if (OrderOpenPrice() > MaxPrc ) MaxPrc = OrderOpenPrice();
if (OrderOpenPrice() }
Изменено пользователем 0ll
Ссылка на сообщение
Поделиться на другие сайты

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



Нужна помощь в определении максимальной цены ордеров (ордера на покупку ) и минимальной цены (для ордеров на продажу).

Там где у Вас есть цикл по всем ордерам делаете:
double MaxPrc = 0, MinPrc = 9999999; - глобальные переменные

MaxPrc = 0; MinPrc = 9999999; // задаём начальные значения
for(int i = 0 ....)
{
....
if (OrderOpenPrice() > MaxPrc ) MaxPrc = OrderOpenPrice();
if (OrderOpenPrice() }



Спасибо.

Добавлено: 09-10-2014 13:30:34

:( Вопрос следующего плана:
Открыть ордер на покупку с объемом 0.1; цена ушла вниз на определенное количество пунктов; открываем ордер на продажу с расчетом, что ордер на продажу за минимальное количество пунктов (допустим 3 п) закроет оба ордера в плюс.
Вопрос: каким "макаром" рассчитать объемом ордера на продажу, для того чтобы вышеописанное условие выполнилось??? :-?
Изменено пользователем Crik1978
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Crik1978
Полный! отрицательный профит первого ордера это будет предполагаемый профит второго, но получить он его должен за 3 пп.
Почитай это там есть ответ и его код...
Обрати внимание на это: MarketInfo(_Symbol, MODE_TICKVALUE);
Ссылка на сообщение
Поделиться на другие сайты

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


Crik1978
Полный! отрицательный профит первого ордера это будет предполагаемый профит второго, но получить он его должен за 3 пп.
Почитай это там есть ответ и его код...
Обрати внимание на это: MarketInfo(_Symbol, MODE_TICKVALUE);



Да, минимальное значение пунктов - соответствует MarketInfo(_Symbol, MODE_TICKVALUE);

Добавлено: 09-10-2014 15:34:44



Crik1978
Полный! отрицательный профит первого ордера это будет предполагаемый профит второго, но получить он его должен за 3 пп.
Почитай это там есть ответ и его код...
Обрати внимание на это: MarketInfo(_Symbol, MODE_TICKVALUE);



Да, минимальное значение пунктов - соответствует MarketInfo(_Symbol, MODE_TICKVALUE);


По данной ссылке, представлены информаторы, которые показывают на графике уровень ТП и СЛ с суммой прибыли или убытка.
Я имел ввиду совсем другое..... Изменено пользователем Crik1978
Ссылка на сообщение
Поделиться на другие сайты

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


По данной ссылке, представлены информаторы, которые показывают на графике уровень ТП и СЛ с суммой прибыли или убытка.
Я имел ввиду совсем другое.....

Информаторы показывают: лот Х пункты = прибыль
Ваша задача: лот = прибыль / пункты.
Справитесь?
Ссылка на сообщение
Поделиться на другие сайты

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



По данной ссылке, представлены информаторы, которые показывают на графике уровень ТП и СЛ с суммой прибыли или убытка.
Я имел ввиду совсем другое.....

Информаторы показывают: лот Х пункты = прибыль
Ваша задача: лот = прибыль / пункты.
Справитесь?


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

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

Пожалуйста, помогите. Как написать функцию выбора ближайшего стоп ордера? Обязательно нужно отдельно для байстопа и селлстопа. В уроках MQL я нашел только как выбрать ближайший ордер из всех, а мне надо конкретно байстоп и селлстоп. Заранее благодарен!!!

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

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

Уважаемые програмисты помогите в написаний простого скрипта или индикатора! в мета трейдер 5 есть на панели инструметов стрелка: рисование линий со стрелкой, хотелось бы в родной мета трейдер 4 такой иметь, ничего не трогая особо в функционале.

спасибо нашел. он уже есть в мт4 в виде трендовой линий, просто нужно убрать луч)))))))))))))))

5445.jpg

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

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

Всем привет!
Если открыты несколько ордеров на покупку, как в советнике найти ордер с максимальной ценой? :(

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Crik1978, нужно просто провести сортировку по ценам открытия. Например вот так:
Спойлер

double UpPriceSell() // цена верхнего ордера на продажу
{
double upprice;
double nextprice;

price = 0;

for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_SELL)
{
nextprice = OrderOpenPrice();
if(nextprice > price)
{
upprice = OrderOpenPrice();
price = nextprice;
}
}
}
}
}
return(upprice);
}


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

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


Crik1978, нужно просто провести сортировку по ценам открытия. Например вот так:

Спойлер

double UpPriceSell() // цена верхнего ордера на продажу
{
double upprice;
double nextprice;

price = 0;

for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_SELL)
{
nextprice = OrderOpenPrice();
if(nextprice > price)
{
upprice = OrderOpenPrice();
price = nextprice;
}
}
}
}
}
return(upprice);
}


Тут правда ордера на продажу, но это не важно, просто подставляешь нужные данные и всё.


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

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

Здравствуйте,Сергей.
Начал изучать ваш курс по программированию.Понравилось,доступно.Я ранее пытался программировать по учебнику,но многие вещи только из вашего курса и понял.Спасибо.
У меня такой вопрос,я не нашел в курсе функции GetLastError();
Не могли бы вы записать урок именно по этой теме?
С разборами типичных ошибок,действиями на их устранение и т.д.
Еще раз спасибо за курс.Благодарен вам за труд.

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

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

Добрый день!

Такая задача: в условии на покупку/продажу проверять наличие круглого уровня (1.29 1.30 1.31 итд)

Набросал такой цикл:

Спойлер



extern double begin_level = 1; // уровень, с которого начинаем отсчет
extern double end_level = 1.6; // уровень, которым заканчиваем
extern double step_level = 0.01; // шаг (каждые 100 пунктов)

for(double i =0; i {
string objekt = i;
level = begin_level + i;

ObjectCreate(objekt,OBJ_HLINE,0,0,level);
ObjectSet(objekt,OBJPROP_COLOR,Green);
ObjectSet(objekt,OBJPROP_WIDTH,1);

}

Print("level = " + level);



Линии отображаются на графике как надо, но в журнале level = 2.590000000000001 - почему - понять не могу, перебор идет же вроде до 1.6 только

И вопросы отсюда:
1) Можно ли создать такую переменную, которую можно бы было сравнить с ценой в условии открытия ордера?
2) Или нужно записать значения уровней в массив? Но я правда с массивами не работал почти, не знаю, как вытащить из массива потом уровень, который будет рядом с ценой и проверить в условии открытия ордера
3) Или в условии на открытие ордера написать цикл, в котором перебрать все уровни, и выбрать нужный?

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

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


Линии отображаются на графике как надо, но в журнале level = 2.590000000000001 - почему - понять не могу, перебор идет же вроде до 1.6 только

У Вас цикл от 0 до 1,6, в теле цикла Вы прибавляете 1 (бегин лэвел) итого получается 2,5 - попробуйте цикл сделать от 1 до 1,6.
Цитата

1) Можно ли создать такую переменную, которую можно бы было сравнить с ценой в условии открытия ордера?

double LevelH = NormalizeDouble(Bid + 0.01,2);
Цитата

2) Или нужно записать значения уровней в массив? Но я правда с массивами не работал почти, не знаю, как вытащить из массива потом уровень, который будет рядом с ценой и проверить в условии открытия ордера
3) Или в условии на открытие ордера написать цикл, в котором перебрать все уровни, и выбрать нужный?

С массивами придётся в цикле... Если уровни круглые не парьтесь: сделайте как я выше написал. Будет у Вас два ближайших уровня - если цена пробила - пересчитываем...
Ссылка на сообщение
Поделиться на другие сайты

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


А если каждые 150 пунктов нужны, например?

Всё будет охренеть как сложнее:
double LevelH = NormalizeDouble(Bid + 0.01,2)+0.005;
Ссылка на сообщение
Поделиться на другие сайты

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

Ну это да)

Но я логику не совсем понимаю... Bid и Ask постоянно же меняются
то есть вот у нас сейчас цена 1.03789
double LevelH = NormalizeDouble(Bid + 0.01,2)+0.005;
LevelH равно 1.045
но ведь когда цена достигнет значения 1.04001
LevelH приобретет значение 1.055
И цена таким образом никогда до уровня не дойдет

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

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


но ведь когда цена достигнет значения 1.04001
LevelH приобретет значение 1.055
И цена таким образом никогда до уровня не дойдет

Если на каждом тике считать, то не дойдёт.
oleguitar, ну Вы чего?
Уровни считаются например в начале суток и потом только в случае пробития уровня.
Ссылка на сообщение
Поделиться на другие сайты

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

Приветствую! Я не силен в программировании, поэтому вопрос в следующем- как в советнике ProTrader(прикреплен внизу) сделать открытие buy stop от цены ask, т.е. с учетом спреда. Функция установки стоповых ордеров на расстоянии от цены в этом советнике уже имеется, нужно лишь подправить для buy. Для примера - как это следано в скрипте, представленном ниже.

ProTrader.rar
OpenStopOrderNet_v3.mq4

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

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


как в советнике ProTrader(прикреплен внизу) сделать открытие buy stop от цены ask, т.е. с учетом спреда. Функция установки стоповых ордеров на расстоянии от цены в этом советнике уже имеется, нужно лишь подправить для buy.

А как Вы узнали алгоритм расчёта уровня БайСтоп если исходного кода нет?
Ссылка на сообщение
Поделиться на другие сайты

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

Господа знающие, подскажите, как написать функцию закрытия всех рыночных ордеров при достижении определенного профита?? Я сломал мозг, пересмотрел уроки, но, толи я дурак, толи лыжи не идут.

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

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


Господа знающие, подскажите, как написать функцию закрытия всех рыночных ордеров при достижении определенного профита?? Я сломал мозг, пересмотрел уроки, но, толи я дурак, толи лыжи не идут.

А как считать "определённый профит" знаете? Если да, то копируете этот цикл (по всем нужным ордерам) и вместо той строки, что профит считает пишите:
OrderClose(OrderTicket(), OrderLots(), price, slippage);
только останется цену поставить...
Ссылка на сообщение
Поделиться на другие сайты

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

Я имею в виду заданный профит во внешних параметрах, например 10 долларов. Я посчитал средний профит разнонаправленных ордеров, а потом сравниваю это значение с заданной величиной и при >= закрытие ордеров, НО, видимо где-то ошибка. Подскажите где???
Средний профит--------------------------------------------
double AverageProfit()
{
double avg = 0;
int count = 0;

for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() == Magic && OrderSymbol() == Symbol())
{
if (OrderType() == OP_BUY && OrderType() == OP_SELL)
{
avg += OrderProfit();
count++;
}
}
}
}
return(count);
avg = NormalizeDouble(avg / count, 2);
}
Закрытие ордеров------------------------
if (AverageProfit() >= Profit)
{
switch(OrderType())
{
case OP_BUY: if (OrderClose(ticketbuystop, OrderLots(), OrderClosePrice(), Slipage, Yellow)) break;
case OP_SELL: if (OrderClose(ticketsellstop, OrderLots(), OrderClosePrice(), Slipage, Yellow)) break;
}
}

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

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

Ошибка здесь:
return(count);
avg = NormalizeDouble(avg / count, 2);
нужно:
return(NormalizeDouble(avg / count, 2));

и странности в функции закрытия ордеров:
- где Вы берете тикет (ticketbuystop)?
- где Вы выбираете ордер, чтобы использовать OrderLots()?
- OrderClosePrice() использовать нельзя - там пусто! ордер ещё не закрыт. Справку читаете?

Вы мой пост выше читали?

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

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

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

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

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

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

Войти

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

Войти

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


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

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