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

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

#3726

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


int LossOrders()
{
int oldticket;
ticket = 0;

for (i = OrdersHistoryTotal() - 1; i >= 0; i--)
{
if (OrderSelect (i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
{
oldticket = OrderTicket();
if (oldticket > ticket)
{
ticket = oldticket;
if(OrderProfit() {
orderloss++;
}else orderloss=0;
}
}
}
}
return(orderloss);
}

#3727

Нашел здесь же на ветке. Спасибо xNorDx!

#3728

Здраствуйте. Кто может, помогите разобраться с проблемой. Это касается одно из уроков по MQL.
Не открывается стоп-ордер на покупку. Если задавать вместо Bid конкретное значение, то все огонь!


void OnTick()
{
pipstop = NormalizeDouble(Bid + 10 * Point, 5);
SL = NormalizeDouble(pipstop - 20 * Point, 5);
TP = NormalizeDouble(pipstop + 30 * Point, 5);
ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.01, pipstop, 3, SL, TP, "", 12345, 0, Yellow);
if (ticket }

Изменено 23 августа, 2016 пользователем iPerevalov

#3729


Здраствуйте. Кто может, помогите разобраться с проблемой. Это касается одно из уроков по MQL.
Не открывается стоп-ордер на покупку. Если задавать вместо Bid конкретное значение, то все огонь!


void OnTick()
{
pipstop = NormalizeDouble(Bid + 10 * Point, 5);
SL = NormalizeDouble(pipstop - 20 * Point, 5);
TP = NormalizeDouble(pipstop + 30 * Point, 5);
ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.01, pipstop, 3, SL, TP, "", 12345, 0, Yellow);
if (ticket }


Все будет нормально, не переживай!
#3730


Здраствуйте. Кто может, помогите разобраться с проблемой. Это касается одно из уроков по MQL.
Не открывается стоп-ордер на покупку....



Здравствуйте, сколько у вас в цене знаков после запятой, если 5, то FREEZELEVEL не дает выставить отложенный ордер.
#3731



Здраствуйте. Кто может, помогите разобраться с проблемой. Это касается одно из уроков по MQL.
Не открывается стоп-ордер на покупку. Если задавать вместо Bid конкретное значение, то все огонь!


void OnTick()
{
pipstop = NormalizeDouble(Bid + 10 * Point, 5);
SL = NormalizeDouble(pipstop - 20 * Point, 5);
TP = NormalizeDouble(pipstop + 30 * Point, 5);
ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.01, pipstop, 3, SL, TP, "", 12345, 0, Yellow);
if (ticket }


Все будет нормально, не переживай!

И в мыслях не было! ;)



Здраствуйте. Кто может, помогите разобраться с проблемой. Это касается одно из уроков по MQL.
Не открывается стоп-ордер на покупку....



Здравствуйте, сколько у вас в цене знаков после запятой, если 5, то FREEZELEVEL не дает выставить отложенный ордер.

Да, 5 знаков. Если поставить вместо Bid точное число, ,например, такое как 1.43502, то ордер открывается.
#3732

iPerevalov, сделайте как в приложении. Buy открывается по Ask, у вас BuyStop выставляется по неверной цене, т.е. ниже Ask. Получается (Bid + 10 * Point) OrderSend.mq46 скач.

#3733


iPerevalov, сделайте как в приложении. Buy открывается по Ask, у вас BuyStop выставляется по неверной цене, т.е. ниже Ask. Получается (Bid + 10 * Point)


Глупая ошибка. Спасибо. Сменил Bid на Ask!
#3734

Здравствуйте. По возможности помогите разобраться с частичным закрытием ордеров. Попробовал сам написать код программы.
Первую половину лота необходимо закрыть на главной линии Боллинжера. Вторую - на верхней. Я думал, что это можно реализовать двумя условиями.
В первом условии при вызове функции OrderClose() в параметре количество лотов записал OrderLots() / 2. А во втором условии оставил вызов функции OrderClose().
Компилятор не ругается, но Журнал показывает сообщение: "Ошибка закрытия 1 ордера на покупку". Дело в этом OrderLots() / 2. Так как когда я явно пытался указать значение лота, например, 0.01, то в Журанле уже не было сообщений.

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

// первое условие с центральной линией Боллинжера
if (Bid >= Bonds_Main && CountBuy() > 0)
{
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderMagicNumber() == MAGIC && OrderType() == OP_BUY)
if(!OrderClose(OrderTicket(), OrderLots() / 2, Bid, SLIPPAGE, Black))
Print("Ошибка закрытия 1 ордера на покупку");
}
}
}
// второе условие с верхней линией Боллинжера
if (Bid >= Bonds_Upper && CountBuy() > 0)
{
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderMagicNumber() == MAGIC && OrderType() == OP_BUY)
if(!OrderClose(OrderTicket(), OrderLots(), Bid, SLIPPAGE, Black))
Print("Ошибка закрытия 2 ордера на покупку");
}
}
}

Bonds_Main - значение центральной линии Боллинжера,
Bonds_Upper - значение вверхней линия Боллинжера,
CountBuy() - функция, возвращающая количество ордеров на покупку.

#3735


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



Я знаю в чем проблема, но, пожалуй, не скажу. Сделаю лучше, подскажу как поступать в таких случаях. Просто принтуйте в журнал значения переменных, результаты функций и вычислений.
Например, так
Print("Ошибка закрытия 1 ордера на покупку", OrderLots() / 2);
и сравнивайте с тем, что должно быть.
#3736



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



Я знаю в чем проблема, но, пожалуй, не скажу. Сделаю лучше, подскажу как поступать в таких случаях. Просто принтуйте в журнал значения переменных, результаты функций и вычислений.
Например, так
Print("Ошибка закрытия 1 ордера на покупку", OrderLots() / 2);
и сравнивайте с тем, что должно быть.


Попробовал по вашему совету провести вывод лота. Действительно, ошибка в дроблении. На выходе получается 0.0050000. Написал вывод сообщения о выводе лота выбранного ордера и выводит 0.0100000.
Подумал, вначале что дело в нулях. Но это не так (проверил =) ).

Спасибо вам за помощь. Я понял свою ошибку. Дело в двух проверках. >:d:dДобавил дополнительное условие в первой проверке, для того чтобы не происходило закрытие ордера в нем.
if(Bid >= Bonds_Main && CountBuy() > 0)
{
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderLots() == LOTS)
{
if(OrderMagicNumber() == MAGIC && OrderType() == OP_BUY)
if(!OrderClose(OrderTicket(), OrderLots() / 2, Bid, SLIPPAGE, Black))
Print("Ошибка закрытия ордера на покупку " + DoubleToStr(OrderLots()));
}
}

Изменено 25 августа, 2016 пользователем iPerevalov

#3737

Добрый день!
Можно ли запилить индикатор что бы показывал следующую инфу:
- Количество бычих свечей (зеленый цвет для удобства)
- Количество медвежих свечей (красный цвет для удобства)
- Количество бычих пунктов (зеленый цвет для удобства)
- Количество медвежих пунктов (красный цвет для удобства),
Ну и соответсвенно общий вид 12 б/8 м, 55п/40п ну что -то типо этого.По у же закрытым свечам
Есть идея, но отработку проверял только на небольшом временном периоде(т.к на калькуляторе не реал считать постоянно)
Выложу потом стратегию в разделе стратегий с эти индикатором, если его сварганят.
П.С Ну и конечно же цена вопроса??

#3738

Mario_uka, добрый день! Я могу сделать такой индикатор. Цена вопроса - отзыв о качестве обслуживания.
Как рассчитывать количество пунктов: от открытия до закрытия свечи или от максимума до минимума?

Изменено 29 августа, 2016 пользователем SilverKZ

#3739

Ок! Договорились))

#3740

Ok! Индикатор отображает нужную вам информацию в левом верхнем углу, подробности на скрине. В пунктах для 5-ти знаков от максимума до минимума. Если будет нужно от открытия до закрытия свечи, пишите.
Настройки индикатора:

BarsPeriod = 300;  // Количество баров для подсчета

BarsCounter.ex44 скач.
USDCHFH4.png

#3741

Можешь подкорректировать- нужно по цене открытия и закрытия+ отображение по 4-х знаку, а то много цифр))))
Ну и респект \M/ \M/ \M/ за оперативность.
Где отзыв написать?


Добавлено: 29-08-2016 11:24:23

И еще вопрос можно ли сделать как в этом индюке, тут ранге период можно выбрать на графике двумя вертикальными чертами

VP-Range-v6.ex413 скач.
VP-Range-v6.mq411 скач.

Изменено 29 августа, 2016 пользователем mario_uka

#3742


Можешь подкорректировать- нужно по цене открытия и закрытия+ отображение по 4-х знаку, а то много цифр))))
...


Сделал.

BarsCounter_v2.ex42 скач.

#3743

Спасибо все норм!!!)))Будь другом запили еще вертикальные линии(чтобы двигать можно было для нужного периода) не понятно за какой период он считает, допустим ставлю 119 свечей, если сложить с угла получается 116. я так понял там где типа доджи он за свечу не берет.

#3744

Смогу только завтра. Доджи не считаются, можно сделать так 12 б / 8 м / 1 д.

#3745

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

#3746

Сделал линии, расчет ведется между линиями, доджи не считаются.
Настройки индикатора:

BarsPeriod = 100;      // Количество баров для подсчета
InpColor = clrRed; // Цвет линий
InpStyle = STYLE_DASH; // Стиль линий
InpWidth = 1; // Толщина линий
InpBack = true; // Линии на заднем плане
InpSelection = true; // Выделить для перемещений
InpHidden = true; // Скрыт в списке объектов
InpZOrder = 0; // Приоритет на нажатие мышью


Удачных торгов!

AUDUSDH12.png
BarsCounter_v2.ex43 скач.

#3747

Спасибо! На выходных примерно выложу стратегию, ну и конечно не забуду упомянуть твой вклад l-) в этот индюк)))) Еще раз спасибо :d

#3748

Здравствуйте! Выполняя задание по 5 уроку MQL4, столкнулся в с проблемой.
Задание: написать трейлинг-стоп по Parabolic SAR.
Пятый день не могу понять свою ошибку. В журнале пишет: OrderModify error 1 (то есть "Нет ошибки, но результат неизвестен").
Мог бы кто-нибудь помочь разобраться с заданием?

test5SAR.mq44 скач.

#3749


Здравствуйте! Выполняя задание по 5 уроку MQL4, столкнулся в с проблемой.
Задание: написать трейлинг-стоп по Parabolic SAR.
Пятый день не могу понять свою ошибку. В журнале пишет: OrderModify error 1 (то есть "Нет ошибки, но результат неизвестен").
Мог бы кто-нибудь помочь разобраться с заданием?


Добрый день! Принтуйте SAR и OrderStopLoss(), посмотрите у них разное количество знаков после запятой, поэтому проверка SAR > OrderStopLoss() дает true и осуществляется модификация ордера по той же цене.
Лекарство: SAR = NormalizeDouble(iSAR(Symbol(), 0, 0.02, 0.2, 1), _Digits);
Удачи!
#3750

Привет всем! Прошу помощи.
Помогите написать код для советника, который будет определять ближайшую цену, заканчивающуюся на: 00, 25,50,75. (Либо для пятизнака: 000,250,500,750.)
Например, имеем цену закрытия свечи, 1.11348. Ближайшая верхняя цена, по условиям, 1.11500, а нижняя 1.11250. Надо найти значения этих цен.
Попытался сделать так. Тестер зависает.
double Level_quaternary()
{
double CloseBar = iClose( Symbol(),TFclose,1 ), Step = 25(250 для пятизнака)
for (double i=CloseBar; i {
string a = DoubleToString(i,Digits); //переводим цену в текст.
string b = StringSubstr(a,4,ff); //находим значение окончания
if (b == "250") //если равен 250,500,750,000. то возвращаем значение этой цены.
Soprotivlenie = i;
}
return(Soprotivlenie);
}

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

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