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

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

#1426



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

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


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

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

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

Изменено 9 октября, 2014 пользователем Crik1978

#1427


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

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

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

Изменено 9 октября, 2014 пользователем 0ll

#1428



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

Там где у Вас есть цикл по всем ордерам делаете:
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 п) закроет оба ордера в плюс.
Вопрос: каким "макаром" рассчитать объемом ордера на продажу, для того чтобы вышеописанное условие выполнилось??? :-?

Изменено 9 октября, 2014 пользователем Crik1978

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


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


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

Изменено 9 октября, 2014 пользователем Crik1978

#1431


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

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



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

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


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

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

#1434

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

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

5445.jpg

Изменено 11 октября, 2014 пользователем vitek01

#1435

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

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


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


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


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


спасибо за ответ.
#1438

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

#1439

Добрый день!

Такая задача: в условии на покупку/продажу проверять наличие круглого уровня (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) Или в условии на открытие ордера написать цикл, в котором перебрать все уровни, и выбрать нужный?

#1440


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

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

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

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

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

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

double LevelH = NormalizeDouble(Bid + 0.01,2);



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


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

Всё будет охренеть как сложнее:
double LevelH = NormalizeDouble(Bid + 0.01,2)+0.005;
#1443

Ну это да)

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

#1444


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

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

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

ProTrader.rar8 скач.
OpenStopOrderNet_v3.mq49 скач.

#1446


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

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

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

#1448


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

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

Я имею в виду заданный профит во внешних параметрах, например 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;
}
}

#1450

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

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

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

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

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