Подправил индюшку: теперь вместе с отрисовкой стрелочки заполняются буфера 0-бычий, 1-медвежий.
Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
Подправил индюшку: теперь вместе с отрисовкой стрелочки заполняются буфера 0-бычий, 1-медвежий.
Вау, заработало
upper=iCustom(Symbol(),Period(),"4X Bheurekso Pattern indikator New",lines,step,Dell,0,1);
Благодарю.
А в какой строке сделали изменения? Хочу посмотреть как это делается.
Изменено 23 сентября, 2014 пользователем SergeyNT
Индюшка странная (или у меня что-то не так) - значений в буферах оказывается больше чем стрелочек на графике. Т.е. видимо стрелочки удаляются где-то (т.е. индюк рисует), а значения в буферах остаётся (имхо)
Изменения простые (последний вариант): найдите и раскомментируйте строки "ExtMapBuffer1[shift] = "
Понятно. Видел ранее, но не придал этому значение.
А подскажите как сделать, чтобы какой-либо ценовой уровень, скажем, лоу предыдущего дня, отображался в виде линии и с надписью?
Я так делал:
А подскажите как сделать, чтобы какой-либо ценовой уровень, скажем, лоу предыдущего дня, отображался в виде линии и с надписью?
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); //здесь всплывающая подсказка
Добрый день.
Я недавно скачал видео уроки , стал изучать делать домашнее задание , а таи изменения.
Вопрос где прочитать про эти изменения.
Спасибо .
Хочу попробовать заключить в советник самодельный индикатор пивотов просто, линии было бы интересно увидеть при визуальном тестировании
Ошибок в 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
Я-ж вроде написал пример... Проверьте ObjectCreate .
Ошибок в editor-e нет, но линию не чертит...
Я-ж вроде написал пример... Проверьте ObjectCreate .
Ошибок в editor-e нет, но линию не чертит...
Ага, я просто в справочнике такое нашел...
Только я думал, что линия будет перерисовываться каждый новый день, но она так и остается на месте
Исправил вот таким образом)
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
Это котиры дырявые (имхо)
Судя по всему, все это не влияет на подсчеты уровней, но просто не понятно, что это значит
ЦитатаЭто котиры дырявые (имхо)
Возможно кстати...
Еще вопросик: а как узнать результат последней сделки в истории для конкретного советника? (прибыль/убыток)
Только не от общего баланса, имеется ввиду, что на счету могут совершаться и другие операции, помимо операций советника.
Добрый день.
Я недавно скачал видео уроки , стал изучать делать домашнее задание , а таи изменения.
Вопрос где прочитать про эти изменения.
Спасибо .
Приветствую!
На самом деле практически все старые варианты уроков работают в новых версиях.
Нужно только понимать некоторые вещи типа:
если в старом варианте была функция start(), где мы размещали основной код, то в новой версии эта функция называется OnTick(), точней это уже событие, а не функция, но это не столь важно.
Старая функция init(), теперь как событие OnInit().
Остальное всё по аналогии.
Удачи в изучении MQL!
А как узнать результат последней сделки в истории? (прибыль/убыток)
Только не от общего баланса, имеется ввиду, что на счету могут совершаться и другие операции, помимо операций советника.
В цикле перебираете закрытые ордера (по истории), фильтруете по магику, ищите самый большой тикет или время закрытия, смотрите прибыль. Примеров полно. Единственная хитрость: перебирать надо ордера с конца и ограничивать количество (или дату открытия) иначе терминал будет подвисать на тестировании на большой истории.
А как узнать результат последней сделки в истории? (прибыль/убыток)
Только не от общего баланса, имеется ввиду, что на счету могут совершаться и другие операции, помимо операций советника.
пытаюсь учить язык программирования
вот что написал
int start()
{
Comment("Привет");
return(0);
}
в тестере стратегий ничего не отображается...в чем причина?
пытаюсь учить язык программирования
вот что написал
int start()
{
Comment("Привет");
return(0);
}
в тестере стратегий ничего не отображается...в чем причина?
Дружище, в таком виде операция Comment будет видна только в визуальном режиме тестера стратегий, т.е. на экране. Для того, чтобы это увидеть нужно установить галку "Визуализация" и тогда всё будет видно.
Добрый день.
Скажите правильное ли решения задачи 1 в 1.5 уроке?
А то негде на форуме я не нашел не разбора, не решения этой задачи.
ставлю визуализацию. и по прежнему ничего нет
Кроме Comment() есть Alert() и Print(). Попробуй всех троих (можно одновременно).
ставлю визуализацию. и по прежнему ничего нет
удалил все что было сверху. оставил только
int start()
{
Comment("Привет");
return(0);
}
и все заработало
Попробовал вот так сделать
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
1. Что-б разобраться сделайте: Print("Lot = " + DoubleToStr(Lot,2));
Сначала лот нормальный идет, но после первого же убытка он приобретает вот такое значение:
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
Не понимаю в чем дело...
2. У Вас есть сброс лота в начальный после профита? - если нет - ошибка.
я советую начальный лот и расчётный разнести в разные переменные например РабочийЛот = НачЛот * Мульт;
3. Используйте новые возможности MQL: workLot = (Profit 4. Имейте в виду: в Вашем цикле в переменной Profit - профит последнего (в истории) ордера, но Вы перебираете ВСЮ историю (она может быть большая - я писал), поэтому начните с конца! и после
Profit = OrderCommission()+OrderSwap()+OrderProfit(); //добавьте:
break;
5. Имейте в виду: если сова открыла 1 ордер, потом 2-й, закрыла 2, а потом 1-ый - какой ордер будет последним в истории?
Цитата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 будет результат предпоследнего ордера?
2. Сортируется по тикету, поэтому я делаю всё проще - когда ордер открыт - сохраняю его параметры, а после закрытия применяю
1-й, как я понимаю
А если у Вас работает ещё один советник на счёте? и два последних ордера чужие?Цитата
А правильно ли я понимаю, что если в цикле поставить перебор не от OrdersHistoryTotal()-1, а от OrdersHistoryTotal()-2, то в переменной Profit будет результат предпоследнего ордера?
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем