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

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

#1351
SergeyNT в Вашем релизе индюка буферы выключены (совсем) - т.е. в них нули...
Подправил индюшку: теперь вместе с отрисовкой стрелочки заполняются буфера 0-бычий, 1-медвежий.

4X_Bheurekso_Pattern_indikatorforeks.ru.mq441 скач.

#1352

Вау, заработало
upper=iCustom(Symbol(),Period(),"4X Bheurekso Pattern indikator New",lines,step,Dell,0,1);
Благодарю.

А в какой строке сделали изменения? Хочу посмотреть как это делается.

Изменено 23 сентября, 2014 пользователем SergeyNT

#1353

Индюшка странная (или у меня что-то не так) - значений в буферах оказывается больше чем стрелочек на графике. Т.е. видимо стрелочки удаляются где-то (т.е. индюк рисует), а значения в буферах остаётся (имхо)
Изменения простые (последний вариант): найдите и раскомментируйте строки "ExtMapBuffer1[shift] = "

#1354

Понятно. Видел ранее, но не придал этому значение.

#1355

А подскажите как сделать, чтобы какой-либо ценовой уровень, скажем, лоу предыдущего дня, отображался в виде линии и с надписью?

#1356


А подскажите как сделать, чтобы какой-либо ценовой уровень, скажем, лоу предыдущего дня, отображался в виде линии и с надписью?

Я так делал:
ObjName= "Name_";
txt = "Описание";
ObjectCreate (ObjName, OBJ_TREND, 0, StartX, StartY, EndX, EndY); //Х = время, Y=Y = лоу дня
ObjectSet (ObjName, OBJPROP_RAY, 0);
ObjectSet (ObjName, OBJPROP_WIDTH, 2); //толщина линии
ObjectSet (ObjName, OBJPROP_COLOR, DodgerBlue); //цвет
ObjectSet (ObjName, OBJPROP_BACK, true); //рисовать под барами
ObjectSetString(0, ObjName, OBJPROP_TEXT, txt); //здесь описание
ObjectSetString(0, ObjName, OBJPROP_TOOLTIP, txt); //здесь всплывающая подсказка
#1357

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

#1358

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

Ошибок в editor-e нет, но линию не чертит...
С объектами впервые работаю, не соображу никак в чем дело... :-?


Спойлер


extern string BlockSettings2 = " Area "; // Пока не используется
extern int Area = 2; // Пока не используется


double C, H, L, P, S1, S2, S3, R1, R2, R3;

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if (Digits == 3 || Digits == 5)
{
Area *=10;

}
return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{


}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{

datetime StartTime = iTime(Symbol(), PERIOD_D1, 0);
datetime EndTime = TimeCurrent();

H = iHigh(Symbol(),PERIOD_D1,1);
C = iClose(Symbol(),PERIOD_D1,1);
L = iLow(Symbol(),PERIOD_D1,1);

P = (H+L+C)/3;

S1 = P-(H-P);
S2 = P-(H-L);
S3 = L-2*(H-P);

R1 = P+(P-L);
R2 = P+(H-L);
R3 = H+2*(P-L);

long current_chart_id=ChartID();
string obj_name = "Line_P";
string txt = "P";
ObjectCreate (current_chart_id, obj_name, OBJ_HLINE, 0, StartTime, P, EndTime, P);
ObjectSet (obj_name, OBJPROP_RAY, 0);
ObjectSet (obj_name, OBJPROP_WIDTH, 20);
ObjectSet (obj_name, OBJPROP_COLOR, Blue);
ObjectSetString (0, obj_name, OBJPROP_TEXT, txt);

Print("StartTime = " + StartTime + " EndTime = " + EndTime + " P = " + P);

}



Print сделал для того, чтобы проверить, правильно ли дата берется и нет ли ошибки в подсчете переменной Р
Ошибок, судя по записям в журнале, нет
2014.09.25 22:35:16.693 2014.09.24 09:28 Resistance v 0.2 GBPUSD,M15: StartTime = 2014.09.24 00:00:00 EndTime = 2014.09.24 09:28:09 P = 1.63687
#1359


Ошибок в editor-e нет, но линию не чертит...

Я-ж вроде написал пример... Проверьте ObjectCreate .
#1360



Ошибок в editor-e нет, но линию не чертит...

Я-ж вроде написал пример... Проверьте ObjectCreate .


Ага, я просто в справочнике такое нашел...

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

Исправил вот таким образом)

if (Hour() == 00 && Minute() == 01) { ObjectDelete(obj_name);}

Добавлено: 25-09-2014 20:37:02

Правда журнал выдает ошибки вот такого характера

TestGenerator: unmatched data error (volume limit 1274 at 2014.09.18 13:45 exceeded)
TestGenerator: unmatched data error (high value 1.63399 at 2014.09.18 13:58 and price 1.63404 mismatched)
TestGenerator: unmatched data error (volume limit 816 at 2014.09.18 13:15 exceeded)

Именно в 13:15 и 13:45 для данного дня, для других дней было 8:15 и 8:45, например

На всякий даже привел переменную P вот к такому виду
P = NormalizeDouble(((H+L+C)/3),5);
Но дело не в этом оказалось
Попробовал закомментировать объект, ничего не изменилось, значит дело не в нем...
Судя по всему, все это не влияет на подсчеты уровней, но просто не понятно, что это значит

Изменено 26 сентября, 2014 пользователем oleguitar

#1361


Судя по всему, все это не влияет на подсчеты уровней, но просто не понятно, что это значит

Это котиры дырявые (имхо)
#1362
Цитата

Это котиры дырявые (имхо)



Возможно кстати...

Еще вопросик: а как узнать результат последней сделки в истории для конкретного советника? (прибыль/убыток)
Только не от общего баланса, имеется ввиду, что на счету могут совершаться и другие операции, помимо операций советника.
Автор#1363


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



Приветствую!
На самом деле практически все старые варианты уроков работают в новых версиях.
Нужно только понимать некоторые вещи типа:
если в старом варианте была функция start(), где мы размещали основной код, то в новой версии эта функция называется OnTick(), точней это уже событие, а не функция, но это не столь важно.
Старая функция init(), теперь как событие OnInit().

Остальное всё по аналогии.
Удачи в изучении MQL!
#1364

А как узнать результат последней сделки в истории? (прибыль/убыток)
Только не от общего баланса, имеется ввиду, что на счету могут совершаться и другие операции, помимо операций советника.

#1365


А как узнать результат последней сделки в истории? (прибыль/убыток)
Только не от общего баланса, имеется ввиду, что на счету могут совершаться и другие операции, помимо операций советника.

В цикле перебираете закрытые ордера (по истории), фильтруете по магику, ищите самый большой тикет или время закрытия, смотрите прибыль. Примеров полно. Единственная хитрость: перебирать надо ордера с конца и ограничивать количество (или дату открытия) иначе терминал будет подвисать на тестировании на большой истории.
#1366

пытаюсь учить язык программирования

вот что написал

int start()
{

Comment("Привет");


return(0);
}

в тестере стратегий ничего не отображается...в чем причина?

Автор#1367


пытаюсь учить язык программирования

вот что написал

int start()
{

Comment("Привет");


return(0);
}

в тестере стратегий ничего не отображается...в чем причина?



Дружище, в таком виде операция Comment будет видна только в визуальном режиме тестера стратегий, т.е. на экране. Для того, чтобы это увидеть нужно установить галку "Визуализация" и тогда всё будет видно.
#1368

Добрый день.

Скажите правильное ли решения задачи 1 в 1.5 уроке?

А то негде на форуме я не нашел не разбора, не решения этой задачи.

15.jpg

#1369

ставлю визуализацию. и по прежнему ничего нет

#1370


ставлю визуализацию. и по прежнему ничего нет

Кроме Comment() есть Alert() и Print(). Попробуй всех троих (можно одновременно).
#1371

удалил все что было сверху. оставил только
int start()
{

Comment("Привет");


return(0);
}
и все заработало

#1372

Попробовал вот так сделать

Спойлер


double Profit;
int TotalOrders=OrdersHistoryTotal();
for(int pos=0; pos {
if(OrderSelect(pos,SELECT_BY_POS,MODE_HISTORY) == true)
{
if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)
{

Profit = OrderCommission()+OrderSwap()+OrderProfit();

}
}
else
Print("Ошибка ", GetLastError());
}

if (Profit


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

2014.10.01 13:38:17.606 2014.01.24 03:24 Resistance v 1.0 EURUSD,M15: Lot = 1.#INF
2014.10.01 13:38:17.606 2014.01.24 03:24 Resistance v 1.0 EURUSD,M15: Lot = 1.#INF

Не понимаю в чем дело...

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

#1373


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

2014.10.01 13:38:17.606 2014.01.24 03:24 Resistance v 1.0 EURUSD,M15: Lot = 1.#INF
2014.10.01 13:38:17.606 2014.01.24 03:24 Resistance v 1.0 EURUSD,M15: Lot = 1.#INF

Не понимаю в чем дело...

1. Что-б разобраться сделайте: Print("Lot = " + DoubleToStr(Lot,2));
2. У Вас есть сброс лота в начальный после профита? - если нет - ошибка.
я советую начальный лот и расчётный разнести в разные переменные например РабочийЛот = НачЛот * Мульт;
3. Используйте новые возможности MQL: workLot = (Profit 4. Имейте в виду: в Вашем цикле в переменной Profit - профит последнего (в истории) ордера, но Вы перебираете ВСЮ историю (она может быть большая - я писал), поэтому начните с конца! и после
Profit = OrderCommission()+OrderSwap()+OrderProfit(); //добавьте:
break;
5. Имейте в виду: если сова открыла 1 ордер, потом 2-й, закрыла 2, а потом 1-ый - какой ордер будет последним в истории?
#1374
Цитата

5. Имейте в виду: если сова открыла 1 ордер, потом 2-й, закрыла 2, а потом 1-ый - какой ордер будет последним в истории?



1-й, как я понимаю

Переделал, разбил переменные, добавил функцию FindLastLots

Спойлер


WLot = Lot;
WLotHis = FindLastLots();

double Profit;

for (int pos = OrdersHistoryTotal()-1; pos>=0; pos--)

{
if(OrderSelect(pos,SELECT_BY_POS,MODE_HISTORY) == true)
{
if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)
{

Profit = OrderCommission()+OrderSwap()+OrderProfit();
break;

}
}
else
Print("Ошибка ", GetLastError());
}

if (Profit {
WLot = NormalizeDouble(WLotHis*Multiplier,2); Print("WLot = " + DoubleToStr(WLot,2));
}

//+------------------------------------------------------------------+


double FindLastLots()
{

double oldlots;
int oldticket;

ticket = 0;
for (int i = OrdersHistoryTotal()-1; i >=0; i--)
{
if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)== true)
{
if( OrderSymbol() == Symbol() && OrderMagicNumber() == Magic )
{
oldticket = OrderTicket();
if( oldticket > ticket)
{
oldlots = OrderLots();
ticket = oldticket;
}
}

}

}
return(oldlots);
}




Теперь все работает как надо)

А правильно ли я понимаю, что если в цикле поставить перебор не от OrdersHistoryTotal()-1, а от OrdersHistoryTotal()-2, то в переменной Profit будет результат предпоследнего ордера?
#1375


1-й, как я понимаю

2. Сортируется по тикету, поэтому я делаю всё проще - когда ордер открыт - сохраняю его параметры, а после закрытия применяю
Цитата


А правильно ли я понимаю, что если в цикле поставить перебор не от OrdersHistoryTotal()-1, а от OrdersHistoryTotal()-2, то в переменной Profit будет результат предпоследнего ордера?

А если у Вас работает ещё один советник на счёте? и два последних ордера чужие?

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

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