oleguitar Опубликовано 14 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 августа, 2014 Выглядеть это должно примерно так? bool StopBuy = false;if(Day()==TimeDay(OrderOpenTime()) ) return(0);{ for(int cnt=0;cnt { OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY); }StopBuy = true} Ссылка на сообщение Поделиться на другие сайты More sharing options...
Viri Опубликовано 14 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 августа, 2014 Помогите с неприятностью новичку.Прописал внешний индикатор в советнике, а при тестировании на каждом тике индикатор открывается в новом окне. Как от этого избавиться? Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 14 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 августа, 2014 oleguitarТо, что Вы написали, работать не будет. Я недавно код скидывал в эту ветку с функцией анализа истории (думал для Вас писал). Вкратце: - в истории надо найти свои ордера, искать надо с конца, дата закрытия - сегодня, если нашли бай, то стопбай=труе. В основной функции проверять стопбай перед проверкой условий на бай.Прописал внешний индикатор в советнике, а при тестировании на каждом тике индикатор открывается в новом окне. Как от этого избавиться? :-o Такого ещё небыло... Silentspec даже спрашивал - как такое сделать, но ему никто не подсказал... Будьте добры поделитесь кодом. =d> Ссылка на сообщение Поделиться на другие сайты More sharing options...
Viri Опубликовано 14 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 августа, 2014 Никакого кода пока нетint start(){ if(timeprev == Time[0]) return(0); timeprev = Time[0]; Pindi = iCustom(NULL, 0, "PI bg", period, fl, 0, 0);// PI_UP = iCustom(NULL, 0, "PI bg", period, fl, 1, 0); // Up// PI_DN = iCustom(NULL, 0, "PI bg", period, fl, 2, 0); // Dn Print("PI = "+ PI); // + "; PI_UP = " + PI_UP + "; PI_DN = " + PI_DN); return(0); }В результате на каждой свечке открывается еще одно окно индикатора (10 свечек = 10 индикаторов). Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 14 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 августа, 2014 ViriЗначит всё дело в "PI bg" - что за зверь? Ссылка на сообщение Поделиться на другие сайты More sharing options...
chistaia-rodina Опубликовано 14 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 августа, 2014 Ребят, подскажите, можно ли так подсчитать полную стоимость серии ордеров? Profit += OrderProfit() + OrderCommission() + OrderSwap(); Ссылка на сообщение Поделиться на другие сайты More sharing options...
Viri Опубликовано 15 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 августа, 2014 ViriЗначит всё дело в "PI bg" - что за зверь? Трендовый осцилятор, показывает гистограмму двух цветов. Изменение цвета гистограммы сигнализирует о развороте цены или изменении направления.По истории было видно что перерисовывается, вот и решил посмотреть насколько страшны будут последствия. Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 15 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 августа, 2014 Ребят, подскажите, можно ли так подсчитать полную стоимость серии ордеров? Profit += OrderProfit() + OrderCommission() + OrderSwap();Да.Трендовый осцилятор, показывает гистограмму двух цветов. Изменение цвета гистограммы сигнализирует о развороте цены или изменении направления.По истории было видно что перерисовывается, вот и решил посмотреть насколько страшны будут последствия.Последствия будут как и у всех: слив на флёте. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
oleguitar Опубликовано 15 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 августа, 2014 Цитата То, что Вы написали, работать не будет. Я недавно код скидывал в эту ветку с функцией анализа истории (думал для Вас писал). Вкратце: - в истории надо найти свои ордера, искать надо с конца, дата закрытия - сегодня, если нашли бай, то стопбай=труе. В основной функции проверять стопбай перед проверкой условий на бай. Долго искал, не нашел...А будет ли работать, если сделать так: Спойлер int CountSellOrdersClosed(){ int count = 0;for (int trade = OrdersTotal()-1; trade>=0; trade--){ bool select1 = OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY); datetime oct = OrderCloseTime();if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic){if (OrderType() == OP_SELL && Day() == TimeDay(oct))count++;}}return(count);} А потом в условии открытия ордера проверять, чтобы CountSellOrdersClosed() была == 0Сработает?Я не уверен в Day() == TimeDay(oct) Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 15 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 августа, 2014 Сработает?Нет. Спойлер ToDay = iTime(NULL, PERIOD_D1, 0); for (oNum = OrdersHistoryTotal(); oNum >=0 ; oNum--) { if (OrderSelect(oNum, SELECT_BY_POS, MODE_HISTORY) == TRUE) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if (OrderOpenTime() >= ToDay) { if (OrderType() == OP_BUY) cnt_Buy_ToDay++; if (OrderType() == OP_SELL) cnt_Sel_ToDay++; } else break; } } } Это рабочий код из моей совы. Изменено 15 августа, 2014 пользователем 0ll Ссылка на сообщение Поделиться на другие сайты More sharing options...
oleguitar Опубликовано 15 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 августа, 2014 А что за oNum?ее же вроде как инициализировать надо?и cnt_Buy_ToDay и cnt_Sell_ToDay Спойлер double cnt_Buy_ToDay = 0;double cnt_Sell_ToDay = 0;double ToDay = iTime(NULL, 0, 0); for (int oNum = OrdersHistoryTotal(); oNum >=0 ; oNum--) { if (OrderSelect(oNum, SELECT_BY_POS, MODE_HISTORY) == TRUE) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if (OrderOpenTime() >= ToDay) { if (OrderType() == OP_BUY) cnt_Buy_ToDay++; if (OrderType() == OP_SELL) cnt_Sell_ToDay++; } else break; } } } А в условии на открытие ордера if( cnt_Buy_ToDay >0)и в timeframe нужно дневной указывать именно, или любой? Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 15 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 августа, 2014 oleguitar oNum это номер ордера - intcnt_Buy_ToDay и cnt_Sell_ToDay - тоже int (счётчики) таймфрем Д1 для того чтоб загнать в переменную дату-время начала дня (мы-же за текущий день говорим)если cnt_Buy_ToDay > 0 - значит ордера сегодня уже открывались. Что с этим делать решать Вам. Ссылка на сообщение Поделиться на другие сайты More sharing options...
oleguitar Опубликовано 15 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 августа, 2014 ага, работаетспасибо большое) Ссылка на сообщение Поделиться на другие сайты More sharing options...
chistaia-rodina Опубликовано 19 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 августа, 2014 Ребят, вот ещё такой вопрос, раньше не приходилось сталкиваться. Что должно происходить, если бот стоит на живом рынке и при этом поменять код в эдиторе, а затем скомпилировать, не убирая при этом бота с графика? У меня бот при этом удалил и снова поставил стоповые отложки по заданным условиям, хотя в коде условия по их удалению не подошли. Понимаю что лезть в код работающего бота глупость, но просто хотелось бы знать, как такие действия расцениваются и обрабатываются на программном уровне, заложенном разработчиками. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Silentspec Опубликовано 19 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 августа, 2014 Произойдет деинициализация советника, а затем инициализация.То же самое, как если бы вы выключили, а потом включили терминал. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 19 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 августа, 2014 aleksej1749 "СОЗДАТЕЛЯ" давно не видно, но прогеры сюда наведываются. Т.к. времени у них мало, то надо вопросы задавать чётко, по-военному, тогда и ответы чёткие получите...Например: кусок кода и описание ошибки. Ссылка на сообщение Поделиться на другие сайты More sharing options...
chistaia-rodina Опубликовано 19 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 августа, 2014 0ll, подскажи, по индикатору TMA+CG не было ли каких-то особенностей по взятию с него данных, например обязательно с нулевого или первого бара? Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 20 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 августа, 2014 0ll, подскажи, по индикатору TMA+CG не было ли каких-то особенностей по взятию с него данных, например обязательно с нулевого или первого бара?Я брал с первого (а почему - уже не помню): upper_TMA = iCustom(NULL, 0, "TMA+CG", "current time frame", ТМА_HalfLength, PRICE_WEIGHTED, ТМА_Deviations, true, 1, 1); lower_TMA = iCustom(NULL, 0, "TMA+CG", "current time frame", ТМА_HalfLength, PRICE_WEIGHTED, ТМА_Deviations, true, 2, 1); 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
oleguitar Опубликовано 20 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 августа, 2014 Добрый вечер!Посмотрел урок по качественному открытию и модификации ордеров, хочу, чтобы в моем советнике выполнялась проверка на ошибки. Но столкнулся с проблемой: при компиляции метаэдитор требует вернуть некое значение в двух местах Спойлер #include //+------------------------------------------------------------------+//| test8.mq4 |//| Copyright 2014, Oleg Novinsky. |//| |//+------------------------------------------------------------------+#property copyright "Copyright 2014, Oleg Novinsky."#property link ""#property version "1.00"#property strictint signal =1;//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int OnInit() { return(INIT_SUCCEEDED); }//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+void OnDeinit(const int reason) { }//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+void OnTick() { if (signal == 1) { int ticket = OrderSendX(Symbol(), OP_BUY, 0.1, Ask, 30,0,0,"", 123, 0, Blue ); double asl = NormalizeDouble(Ask -300*Point, Digits); double atp = NormalizeDouble(Ask + 500*Point, Digits); } }//+------------------------------------------------------------------+ int OrderSendX( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment, int magic = 0, datetime expiration = 0, color arrow_color=CLR_NONE) { int err = GetLastError(); err = 0; bool exit_loop = false; int ticket = -1; int retry = 10; int cnt = 0; if(cmd == OP_BUY || cmd == OP_SELL) { while(!exit_loop) { ticket = OrderSend(symbol, cmd, volume, price, slippage,stoploss, takeprofit, comment, magic, expiration, arrow_color ); err = GetLastError(); switch(err) { case ERR_NO_ERROR: exit_loop = true; break; case ERR_SERVER_BUSY: case ERR_NO_CONNECTION: case ERR_BROKER_BUSY: case ERR_TRADE_CONTEXT_BUSY: cnt++; break; case ERR_INVALID_PRICE: case ERR_PRICE_CHANGED: case ERR_OFF_QUOTES: case ERR_REQUOTE: RefreshRates(); continue; default: exit_loop = true; break; } if(cnt>retry) exit_loop = true; if (!exit_loop) { Sleep(1000); RefreshRates(); } else { if( err != ERR_NO_ERROR) { Print("Ошибка :" + err); } } if(err == ERR_NO_ERROR) { if ( OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES)) { Print ("Ордер успешно выбран"); } else Print("Одер не выбран"); return(ticket); } Print ("Ошибка открытия ордера после" + cnt + "попыток."); } } } //+------------------------------------------------------------------+ bool OrderModifyX(int ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE) { if(OrderSelect(ticket, SELECT_BY_TICKET,MODE_TRADES)) { price = NormalizeDouble(price, Digits); stoploss = NormalizeDouble(stoploss, Digits); takeprofit = NormalizeDouble(takeprofit, Digits); CheckValidStop (Symbol(), price, stoploss); int err = GetLastError(); err = 0; bool exit_loop = false; bool result; int retry = 10; int cnt = 0; while(!exit_loop) { result = OrderModify(ticket, price, stoploss, takeprofit, expiration, arrow_color); err = GetLastError(); if (result == true) { Print("Ордер#" + ticket + "успешно модифицирован."); return(true); switch(err) { case ERR_NO_ERROR: exit_loop = true; break; case ERR_SERVER_BUSY: case ERR_NO_CONNECTION: case ERR_BROKER_BUSY: case ERR_TRADE_CONTEXT_BUSY: cnt++; break; case ERR_INVALID_PRICE: case ERR_PRICE_CHANGED: case ERR_OFF_QUOTES: case ERR_REQUOTE: RefreshRates(); continue; default: exit_loop = true; break; } } } if(err != ERR_NO_ERROR) { Print ("Ошибка модификации ордера #" + ticket); Print ("Код ошибки: " + err); } } else { Print("Не удалось выбрать ордерб ticket = " + ticket); return(false); } }//+------------------------------------------------------------------+ void CheckValidStop (string symbol, double price, double& sl) { if(sl == 0) return; double servers_min_stop = MarketInfo(symbol, MODE_STOPLEVEL) * MarketInfo (symbol, MODE_POINT); if(MathAbs (price - sl) { if(price > sl) sl = price - servers_min_stop; else sl = sl + servers_min_stop; } sl = NormalizeDouble(sl, MarketInfo (symbol, MODE_DIGITS)); } Ошибки вот где Спойлер Спойлер Ссылка на сообщение Поделиться на другие сайты More sharing options...
Silentspec Опубликовано 20 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 августа, 2014 Потому что перед этими } твоими ты забыл написать return(значение твое);Функция у тебя int OrderSendXдолжна значение интегер вернуть,bool OrderModifyX должна тру/фалс вернутьВ первом случае 0,во втором true Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 20 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 августа, 2014 Добрый вечер!Кроме прямых ошибок, на которые указал Silentspec есть логические в этом куске: while(!exit_loop) //Цикл на модификацию ордера { result = OrderModify(ticket, price, stoploss, takeprofit, expiration, arrow_color); err = GetLastError(); //Получение кода ошибки if (result == true) //Если ордер модифицирован - ! { Print("Ордер#" + ticket + "успешно модифицирован."); return(true); //Так как закрывающей скобки "}" нет, то выход в любом случае switch(err) //Обработка ошибки - сюда выполнение не дойдёт !!!!!!!!!!!!!!!!!!!!Проверьте весь блок модификации отрытого ордера - кривая логика. Ссылка на сообщение Поделиться на другие сайты More sharing options...
oleguitar Опубликовано 20 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 августа, 2014 Цитата Кроме прямых ошибок, на которые указал Silentspec есть логические в этом куске: while(!exit_loop) //Цикл на модификацию ордера { result = OrderModify(ticket, price, stoploss, takeprofit, expiration, arrow_color); err = GetLastError(); //Получение кода ошибки if (result == true) //Если ордер модифицирован - ! { Print("Ордер#" + ticket + "успешно модифицирован."); return(true); //Так как закрывающей скобки "}" нет, то выход в любом случае switch(err) //Обработка ошибки - сюда выполнение не дойдёт !!!!!!!!!!!!!!!!!!!!Проверьте весь блок модификации отрытого ордера - кривая логика. то есть если сделать так, то должно дойти до switch? Спойлер while(!exit_loop) { result = OrderModify(ticket, price, stoploss, takeprofit, expiration, arrow_color); err = GetLastError(); //Получение кода ошибки if (result == true) { Print("Ордер#" + ticket + "успешно модифицирован."); return(true); } switch(err) или нужно добавить else Спойлер while(!exit_loop) { result = OrderModify(ticket, price, stoploss, takeprofit, expiration, arrow_color); err = GetLastError(); //Получение кода ошибки if (result == true) { Print("Ордер#" + ticket + "успешно модифицирован."); return(true); } else { switch(err) } Ссылка на сообщение Поделиться на другие сайты More sharing options...
Silentspec Опубликовано 20 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 августа, 2014 Второй вариант Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 20 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 августа, 2014 то есть если сделать так, то должно дойти до switch?Т.к. в if включен return, то оба варианта будут работать одинаково... Ссылка на сообщение Поделиться на другие сайты More sharing options...
oleguitar Опубликовано 20 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 августа, 2014 Понял, спасибо Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти