Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 1099
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
https://docs.mql4.com/ru/objects/objectgetdouble
https://docs.mql4.com/ru/objects/objectgetinteger
Спасибо ! Все понял. Теперь такой вопрос. Эти функции работают для получения значения от объектов. Но как получить значения , допустим , стрелок,
которые видны на графике, но не видны в списке объектов. Например, если стрелки прорисованы , например :
SetIndexStyle(0, DRAW_ARROW);
SetIndexArrow(0, 234);
\\\\
ObjectsTotal() ( да и другие функции объектов) эти стрелки не видят....
Спасибо ! Все понял. Теперь такой вопрос. Эти функции работают для получения значения от объектов. Но как получить значения , допустим , стрелок,
которые видны на графике, но не видны в списке объектов. Например, если стрелки прорисованы , например :
SetIndexStyle(0, DRAW_ARROW);
SetIndexArrow(0, 234);
\\\\
ObjectsTotal() ( да и другие функции объектов) эти стрелки не видят....
iCustom в помощь
Добрый вечер! Подскажите где ошибка, индикатор взял из учебника mql4 https://book.mql4.com/ru/samples/icustom. Но хочу чтоб огибающая была в отдельном окне. На скрине в основном окне индикатор из учебника, в нижнем окне то что получилось у меня
.
Добрый вечер! Подскажите где ошибка, индикатор взял из учебника mql4 https://book.mql4.com/ru/samples/icustom. Но хочу чтоб огибающая была в отдельном окне. На скрине в основном окне индикатор из учебника, в нижнем окне то что получилось у меня
А минимум зачем задавать?
#property indicator_minimum 1???
Да и цвет два раза тозе, зачем, причём разный?
Но главная ошибка - в стиле буфера, с количеством параметров чутка промашка вышла.
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,0,indicator_color1);
В общем, как-то вот так:
А минимум зачем задавать?
#property indicator_minimum 1???
Да и цвет два раза тозе, зачем, причём разный?
Но главная ошибка - в стиле буфера, с количеством параметров чутка промашка вышла.
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,0,indicator_color1);
В общем, как-то вот так:
Огромнейшее спасибо! По поводу #property indicator_minimum 1 я вообще не знаю для чего это :) , если не сложно разъясните?? Мой опыт программирования это 3 сливных советника
Нижнее ограничение шкалы отдельного окна индикатора, всё выходящее за рамки не показывается в окне. Обычно минимум-максимум задают, когда нужен фиксированный масштаб индикатора и известно, что его значения не выходят за пределы этого ограничения.
Нижнее ограничение шкалы отдельного окна индикатора, всё выходящее за рамки не показывается в окне. Обычно минимум-максимум задают, когда нужен фиксированный масштаб индикатора и известно, что его значения не выходят за пределы этого ограничения.
Уважаемые программисты, помогите пожалуйста , установить запрет на открытие более одной серии сделок одновременно ( серия это если ордер закрывается в убытке или в нолях и тогда открывается следующая сделка по этому же инструменту, но с увеличенным лотом), то есть если открывается одна серия сделок вторая и последующая ставиться по другим инструментам под запрет ( бот одновременно работает на разных инструментах). Думаю, это нужно делать через глобальную переменную терминала, но у меня не хватает знаний и опыта я только недавно начал изучать MQL. Это советник по бинарным опционам. Вот код
extern double Lots = 1; // Лот
extern int Exp = 1; // Експирация
extern int Wait = 1; // Количество свечей одного направления
extern int Timeout = 1; // Промежуток времени
extern double Multiplier = 3; // Множитель
extern int Slippage = 5; // Проскальзывание
extern int Magic = 2090; // Магик
int ticket, Type;
double Price, Lot;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// --------------- Открытие сделок ---------------
if (OrdersTotal() == 0) // Количество ордеров должно равняться нулю
{
if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))
|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))
// Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом
{
Type = TypeLastHistOrder();
if (Type == OP_BUY) Price = Ask;
if (Type == OP_SELL) Price = Bid;
Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);
ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0)
// Если прибыль последней сделки равняется нулю, то открывается такая же
{
Type = TypeLastHistOrder();
if (Type == OP_BUY) Price = Ask;
if (Type == OP_SELL) Price = Bid;
Lot = NormalizeDouble(LotsLastHistOrder(), 2);
ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))
|| (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))
|| CountHistTrades() == 0)// Если последняя сделка прибыльная, то открывается ордер
{
if (SignalBuy() && OrdersTotal() == 0)
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);
}
if (SignalSell() && OrdersTotal() == 0)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);
Comment ("PriceCloseLastHistOrder(OP_BUY)= ", PriceCloseLastHistOrder(OP_BUY), "PriceCloseLastHistOrder(OP_SELL)=",
PriceCloseLastHistOrder(OP_SELL) );
}
}
}
}
//+------------------------------------------------------------------+
int CountTrades(int type = -1) // Определение количества сделок
{
int cnt = 0;
for (int i=OrdersTotal()-1; i>=0; i--) // В цикле идет перебор абсолютно всех открытых ордеров, i -- порядковый номер ордера
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) // Функция проверяет есть ли в рынке ордер с порядковым ордером i,
// если есть то проверяются следующие условия...
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1)) // Если символ,
// на котором открыт ордер, равняется текущему символу и Магик ордера равняется магику в настройках текущего советника и
// тип ордера равняется равняется значению type (или type == -1 (в случае, если без разницы какой тип нужен для подсчета ордеров))
cnt++; // К переменной cnt добавляется 1, и в конце цикла cnt уже будет равнятся количеству сделок,
// открытых текущим советнкиом по текущей валютной паре с определенным типом
}
}
return(cnt); // Возвращается значение переменной cnt
}
//+------------------------------------------------------------------+
int CountHistTrades(int type = -1)
{
int cnt = 0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
cnt++;
}
}
return(cnt);
}
//+------------------------------------------------------------------+
bool SignalBuy()
{
for (int i=1; i<=Wait; i++)
{
if (Close[i] > Open[i]) return(false);
}
if ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))
&& CountHistTrades() > 0) return(true);
if (CountHistTrades() == 0) return(true);
return(false);
}
//+------------------------------------------------------------------+
bool SignalSell()
{
for (int i=1; i<=Wait; i++)
{
if (Close[i] < Open[i]) return(false);
}
if ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))
&& CountHistTrades() > 0) return(true);
if (CountHistTrades() == 0) return(true);
return(false);
}
//+------------------------------------------------------------------+
datetime TimeLastHistOrder(int type = -1)
{
datetime lasttime = 0;
datetime opentime = 0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
{
if (OrderCloseTime() > lasttime)
{
lasttime = OrderCloseTime();
opentime = OrderOpenTime();
}
}
}
}
return(opentime);
}
//+------------------------------------------------------------------+
int TypeLastHistOrder()
{
datetime time = 0;
int type = -1;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderCloseTime() > time)
{
time = OrderCloseTime();
type = OrderType();
}
}
}
}
return(type);
}
//+------------------------------------------------------------------+
double LotsLastHistOrder(int type = -1)
{
datetime time = 0;
double lots = 0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
{
if (OrderOpenTime() > time)
{
time = OrderOpenTime();
lots = OrderLots();
}
}
}
}
return(lots);
}
//+------------------------------------------------------------------+
double PriceCloseLastHistOrder(int type = -1)
{
datetime time = 0;
double price = 0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
{
if (OrderCloseTime() > time)
{
time = OrderCloseTime();
price = OrderClosePrice();
}
}
}
}
return(price);
}
//+------------------------------------------------------------------+
double PriceOpenLastHistOrder(int type = -1)
{
datetime time = 0;
double price = 0;
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))
{
if (OrderCloseTime() > time)
{
time = OrderCloseTime();
price = OrderOpenPrice();
}
}
}
}
return(price);
}
//+------------------------------------------------------------------+
У меня при программировании появился вопрос: а можно ли как-то получить в Советнике время сервера с точностью до миллисекунд?
Например, получаем: 23.09.2016 14час. : 53мин. : 54000 миллисекунд? То есть ровно в 54 секунды, 000 м/сек.