Уважаемые коллеги-профессионалы, нужна ваша помощь (пли-и-из). В советнике хочу сделать функцию, которая выводит уведомление в вернем углу экрана о текущем тренде на разных таймфреймах и предстоящем развороте. Для этого использую свои функции LinearRegression и Diverg. Однако я никогда не работал с функцией Comment и поэтому не могу понять, где я допустил ошибку. В общем, в результате работы нижеприведенного кода на экран выводится только надпись "Тренд W = Вниз", а хотелось бы чтобы отображалась информация и по всем остальным TF.
Уважаемые коллеги-профессионалы, нужна ваша помощь (пли-и-из). В советнике хочу сделать функцию, которая выводит уведомление в вернем углу экрана о текущем тренде на разных таймфреймах и предстоящем развороте. Для этого использую свои функции LinearRegression и Diverg. Однако я никогда не работал с функцией Comment и поэтому не могу понять, где я допустил ошибку. В общем, в результате работы нижеприведенного кода на экран выводится только надпись "Тренд W = Вниз", а хотелось бы чтобы отображалась информация и по всем остальным TF.
Функция выводит комментарий, определенный пользователем, в левый верхний угол графика. Параметры могут иметь любой тип. Количество параметров не может превышать 64.
Массивы нельзя передавать в функцию Comment(). Массивы должны печататься поэлементно.
Данные типа double выводятся с 4 десятичными цифрами после точки. Для вывода чисел с большей точностью необходимо использовать функцию DoubleToStr(). Типы bool, datetime и color будут напечатаны как числа. Чтобы вывести данные типа datetime в виде строки используйте функцию TimeToStr().
Для разделения выводимой информации на несколько строк можно использовать символ перевода строки "\n" либо "\r\n". См. также функции Alert() и Print().
Параметры:
...
-
Любые значения, разделенные запятыми.
Пример:
double free=AccountFreeMargin();
Comment("Account free margin is ",DoubleToStr(free,2),"\n","Current time is ",TimeToStr(TimeCurrent()));
Спасибо. Я понял. Мне нужно ввести переменные по результатам отработки функций LinearRegression и Diverg по каждому ТФ и потом вывести их одним комментарием, можно в несколько строк.
Спасибо. Я понял. Мне нужно ввести переменные по результатам отработки функций LinearRegression и Diverg по каждому ТФ и потом вывести их одним комментарием, можно в несколько строк.
Только есть ограничения по длине строки. Можно воспользоватся функцией от Александра Пака. Если не найдете, то поищу у себя
Roger: Это потому что Вы неправильно скопировали мой пример. Посмотрите внимательно где i, а где к.
Код исправил в соответствии с вашим. При тестировании четыре ордера закрылись в порядке установки на первом тике, пятый - на следующем. Вероятно, здесь что-то ещё не так т.к. тестировал неоднократно. Код программы и записи из журнала тестера привожу. С уважением. Shurkin
Код программы.
//+------------------------------------------------------------------+//| Poligon1.mq4 |//| 21 февраля 2013 года. |//|Тестирование оператора цикла for. |//+------------------------------------------------------------------+#property copyright "21 февраля 2013 года."#property link ""//+------------------------------------------------------------------+//|Объявленные переменные |//+------------------------------------------------------------------+int Mn=357;//Magic numberint i;//Показатель счётчика итерацийdouble PriTP;//TP серииint Tick;//Счётчик тиков//+------------------------------------------------------------------+//| expert initialization function |//+------------------------------------------------------------------+int init()
{
//----Установка серии ордеровOrderSend(Symbol(),OP_BUY,0.5,Ask,0,NormalizeDouble(Bid-35*Point,Digits),
NormalizeDouble(Ask+35*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUYOrderSend(Symbol(),OP_BUY,1,Ask,0,NormalizeDouble(Bid-25*Point,Digits),
NormalizeDouble(Ask+25*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUYOrderSend(Symbol(),OP_BUY,1.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUYOrderSend(Symbol(),OP_BUY,2.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUYOrderSend(Symbol(),OP_BUY,3.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUYOrderSend(Symbol(),OP_BUYLIMIT,1,NormalizeDouble(Ask-15*Point,Digits),0,
NormalizeDouble(Bid-40*Point,Digits),NormalizeDouble(Ask+25*Point,Digits),
NULL,Mn,0,CLR_NONE);//OP_BUYLIMITOrderSend(Symbol(),OP_SELLSTOP,3,NormalizeDouble(Ask-30*Point,Digits),0,
NormalizeDouble(Bid+15*Point,Digits),NormalizeDouble(Ask-75*Point,Digits),
NULL,Mn,0,CLR_NONE);//OP_SELLSTOP//----
PriTP=Bid;//PriTPPrint("Кс0:"," OrdersTotal=",OrdersTotal());//Сообщение//----return(0);
}
//+------------------------------------------------------------------+//| expert deinitialization function |//+------------------------------------------------------------------+int deinit()
{
//----//----return(0);
}
//+------------------------------------------------------------------+//| expert start function |//+------------------------------------------------------------------+int start()
{
//----
Tick++;//Tick// Print("Кс0:"," Tick=",Tick);//Сообщение//----// for(i=0;i<OrdersTotal();i++)//Инициализация цикла// for(i=OrdersTotal()-1; i>=0; i--)//for(i=0, int k=0; i<OrdersTotal();i++,k++)//
{
Print("Кс1:"," Tick=",Tick," i=",i," k=",k);//Сообщениеif(OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)//Выбор ордера k
{
if(OrderSymbol()==Symbol())//Символ
{
if(OrderMagicNumber()==Mn)//Идентификационное число
{
if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//Тип операции текущего выбранного ордера
{
OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);//Закрытие позиции
k--;//?
}//Закрыто if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
}//Закрыто if(OrderMagicNumber()==Mn)
}//Закрыто if(OrderSymbol()==Symbol()
}//Закрыто if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
}//Закрыто for(i=0, int k=0; i<OrdersTotal();i++,k++)/*
for(i=0, int k=0; i<OrdersTotal();i++,k++)//
{
Print("Кс1:"," Tick=",Tick," i=",i," k=",k);//Сообщение
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)//Выбор ордера i
{
if(OrderSymbol()==Symbol())//Символ
{
if(OrderMagicNumber()==Mn)//Идентификационное число
{
if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//Тип операции текущего выбранного ордера
{
OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);//Закрытие позиции
k--;//Зачем сначала прибавлять и тут же убавлять ???
}//Закрыто if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
}//Закрыто if(OrderMagicNumber()==Mn)
}//Закрыто if(OrderSymbol()==Symbol()
}//Закрыто if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
}//Закрыто for(i=0;i<OrdersTotal();i++)
*///----return(0);
}
//+------------------------------------------------------------------+
Записи в журнале тестера.
2013.03.1813:58:212013.02.1112:15 Poligon1 EURUSD,M15: Êñ1: Tick=4 i=1 k=12013.03.1813:58:212013.02.1112:15 Poligon1 EURUSD,M15: Êñ1: Tick=4 i=0 k=02013.03.1813:57:572013.02.1112:15 Poligon1 EURUSD,M15: Êñ1: Tick=3 i=1 k=12013.03.1813:57:572013.02.1112:15 Poligon1 EURUSD,M15: Êñ1: Tick=3 i=0 k=02013.03.1813:57:332013.02.1112:15 Poligon1 EURUSD,M15: Êñ1: Tick=2 i=1 k=02013.03.1813:57:332013.02.1112:15 Poligon1 EURUSD,M15: close #5buy3.50EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.33942013.03.1813:57:332013.02.1112:15 Poligon1 EURUSD,M15: Êñ1: Tick=2 i=0 k=02013.03.1813:57:092013.02.1112:15 Poligon1 EURUSD,M15: close #4 buy 2.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.33952013.03.1813:57:092013.02.1112:15 Poligon1 EURUSD,M15: Êñ1: Tick=1 i=3 k=02013.03.1813:57:092013.02.1112:15 Poligon1 EURUSD,M15: close #3 buy 1.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.33952013.03.1813:57:092013.02.1112:15 Poligon1 EURUSD,M15: Êñ1: Tick=1 i=2 k=02013.03.1813:57:092013.02.1112:15 Poligon1 EURUSD,M15: close #2 buy 1.00 EURUSD at 1.3397 sl: 1.3370 tp: 1.3422 at price 1.33952013.03.1813:57:092013.02.1112:15 Poligon1 EURUSD,M15: Êñ1: Tick=1 i=1 k=02013.03.1813:57:092013.02.1112:15 Poligon1 EURUSD,M15: close #1 buy 0.50 EURUSD at 1.3397 sl: 1.3360 tp: 1.3432 at price 1.33952013.03.1813:57:092013.02.1112:15 Poligon1 EURUSD,M15: Êñ1: Tick=1 i=0 k=02013.03.1813:57:092013.02.1112:15 Poligon1 EURUSD,M15: Êñ0: OrdersTotal=72013.03.1813:57:092013.02.1112:15 Poligon1 EURUSD,M15: open #7 sell stop 3.00 EURUSD at 1.3367 sl: 1.3410 tp: 1.3322 ok2013.03.1813:57:092013.02.1112:15 Poligon1 EURUSD,M15: open #6 buy limit 1.00 EURUSD at 1.3382 sl: 1.3355 tp: 1.3422 ok2013.03.1813:57:092013.02.1112:15 Poligon1 EURUSD,M15: open #5 buy 3.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok2013.03.1813:57:092013.02.1112:15 Poligon1 EURUSD,M15: open #4 buy 2.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok2013.03.1813:57:092013.02.1112:15 Poligon1 EURUSD,M15: open #3 buy 1.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok2013.03.1813:57:092013.02.1112:15 Poligon1 EURUSD,M15: open #2 buy 1.00 EURUSD at 1.3397 sl: 1.3370 tp: 1.3422 ok2013.03.1813:57:092013.02.1112:15 Poligon1 EURUSD,M15: open #1 buy 0.50 EURUSD at 1.3397 sl: 1.3360 tp: 1.3432 ok2013.03.1813:57:09 Poligon1 test started
2013.03.1813:57:02 Poligon1 EURUSD,M15: loaded successfully
Где лучше объявлять тип переменной (int, double и т.д.) с точки зрения уменьшения затратности ресурсов исполнения программы. Напр. int i можно объявить на глобальном уровне, а можно и в int start() ... в for (int i=OrdersTotal()-1; i>=0; i--) ... У меня есть ощущение, что объявление на каждом тике затратнее, чем один раз на глобальном уровне, сразу же после extern parameters. Или же разница в ресурсоёмкости одинакова?
Zhunko: Зациклить старт надо. Внутри цикла работать. Там всё можно.
это немного не то. когда пропадет связь, в журнале пишет "Ping failed". значит есть ф-ии, но они почему-то не документированы. а при зацикленном насколько увеличивается нагрузка на проц и память?
Уважаемые коллеги-профессионалы, нужна ваша помощь (пли-и-из). В советнике хочу сделать функцию, которая выводит уведомление в вернем углу экрана о текущем тренде на разных таймфреймах и предстоящем развороте. Для этого использую свои функции LinearRegression и Diverg. Однако я никогда не работал с функцией Comment и поэтому не могу понять, где я допустил ошибку. В общем, в результате работы нижеприведенного кода на экран выводится только надпись "Тренд W = Вниз", а хотелось бы чтобы отображалась информация и по всем остальным TF.
void UPDN ()
{
if(LinearRegression(Symbol( ), LR_TFr_1, 0, Diver_Per_H1, 0) < 0) Comment("Тренд H1 = Вверх");
if(Diverg(LR_TFr_1,0,Diver_Per_H1)<0) Comment("...!Разворот на H1 = Вниз");
if(LinearRegression(Symbol( ), LR_TFr_2, 0, Diver_Per_H4, 0) < 0) Comment("Тренд H4 = Вверх");
if(Diverg(LR_TFr_2,0,Diver_Per_H4)<0) Comment("...!Разворот на H4 = Вниз");
if(LinearRegression(Symbol( ), LR_TFr_3, 0, Diver_Per_D1, 0) < 0) Comment("Тренд D1 = Вверх");
if(Diverg(LR_TFr_3,0,Diver_Per_D1)<0) Comment("...!Разворот на D1 = Вниз");
if(LinearRegression(Symbol( ), LR_TFr_4, 0, Diver_Per_W, 0) < 0) Comment("Тренд W = Вверх");
if(Diverg(LR_TFr_4,0,Diver_Per_W)<0) Comment("...!Разворот на W = Вниз");
if(LinearRegression(Symbol( ), LR_TFr_1, 0, Diver_Per_H1, 0) > 0) Comment("Тренд H1 = Вниз");
if(Diverg(LR_TFr_1,0,Diver_Per_H1)>0) Comment("...!Разворот на H1 = Вверх");
if(LinearRegression(Symbol( ), LR_TFr_2, 0, Diver_Per_H4, 0) > 0) Comment("Тренд H4 = Вниз");
if(Diverg(LR_TFr_2,0,Diver_Per_H4)>0) Comment("...!Разворот на H4 = Вверх");
if(LinearRegression(Symbol( ), LR_TFr_3, 0, Diver_Per_D1, 0) > 0) Comment("Тренд D1 = Вниз");
if(Diverg(LR_TFr_3,0,Diver_Per_D1)>0) Comment("...!Разворот на D1 = Вверх");
if(LinearRegression(Symbol( ), LR_TFr_4, 0, Diver_Per_W, 0) > 0) Comment("Тренд W = Вниз");
if(Diverg(LR_TFr_4,0,Diver_Per_W)>0) Comment("...!Разворот на W = Вверх");
return(0);
}
Уважаемые коллеги-профессионалы, нужна ваша помощь (пли-и-из). В советнике хочу сделать функцию, которая выводит уведомление в вернем углу экрана о текущем тренде на разных таймфреймах и предстоящем развороте. Для этого использую свои функции LinearRegression и Diverg. Однако я никогда не работал с функцией Comment и поэтому не могу понять, где я допустил ошибку. В общем, в результате работы нижеприведенного кода на экран выводится только надпись "Тренд W = Вниз", а хотелось бы чтобы отображалась информация и по всем остальным TF.
void UPDN ()
{
if(LinearRegression(Symbol( ), LR_TFr_1, 0, Diver_Per_H1, 0) < 0) Comment("Тренд H1 = Вверх");
if(Diverg(LR_TFr_1,0,Diver_Per_H1)<0) Comment("...!Разворот на H1 = Вниз");
if(LinearRegression(Symbol( ), LR_TFr_2, 0, Diver_Per_H4, 0) < 0) Comment("Тренд H4 = Вверх");
if(Diverg(LR_TFr_2,0,Diver_Per_H4)<0) Comment("...!Разворот на H4 = Вниз");
if(LinearRegression(Symbol( ), LR_TFr_3, 0, Diver_Per_D1, 0) < 0) Comment("Тренд D1 = Вверх");
if(Diverg(LR_TFr_3,0,Diver_Per_D1)<0) Comment("...!Разворот на D1 = Вниз");
if(LinearRegression(Symbol( ), LR_TFr_4, 0, Diver_Per_W, 0) < 0) Comment("Тренд W = Вверх");
if(Diverg(LR_TFr_4,0,Diver_Per_W)<0) Comment("...!Разворот на W = Вниз");
if(LinearRegression(Symbol( ), LR_TFr_1, 0, Diver_Per_H1, 0) > 0) Comment("Тренд H1 = Вниз");
if(Diverg(LR_TFr_1,0,Diver_Per_H1)>0) Comment("...!Разворот на H1 = Вверх");
if(LinearRegression(Symbol( ), LR_TFr_2, 0, Diver_Per_H4, 0) > 0) Comment("Тренд H4 = Вниз");
if(Diverg(LR_TFr_2,0,Diver_Per_H4)>0) Comment("...!Разворот на H4 = Вверх");
if(LinearRegression(Symbol( ), LR_TFr_3, 0, Diver_Per_D1, 0) > 0) Comment("Тренд D1 = Вниз");
if(Diverg(LR_TFr_3,0,Diver_Per_D1)>0) Comment("...!Разворот на D1 = Вверх");
if(LinearRegression(Symbol( ), LR_TFr_4, 0, Diver_Per_W, 0) > 0) Comment("Тренд W = Вниз");
if(Diverg(LR_TFr_4,0,Diver_Per_W)>0) Comment("...!Разворот на W = Вверх");
return(0);
}
Массивы нельзя передавать в функцию Comment(). Массивы должны печататься поэлементно.
Данные типа double выводятся с 4 десятичными цифрами после точки. Для вывода чисел с большей точностью необходимо использовать функцию DoubleToStr().
Типы bool, datetime и color будут напечатаны как числа.
Чтобы вывести данные типа datetime в виде строки используйте функцию TimeToStr().
Для разделения выводимой информации на несколько строк можно использовать символ перевода строки "\n" либо "\r\n".
См. также функции Alert() и Print().
double free=AccountFreeMargin(); Comment("Account free margin is ",DoubleToStr(free,2),"\n","Current time is ",TimeToStr(TimeCurrent()));Спасибо. Я понял. Мне нужно ввести переменные по результатам отработки функций LinearRegression и Diverg по каждому ТФ и потом вывести их одним комментарием, можно в несколько строк.
Спасибо. Я понял. Мне нужно ввести переменные по результатам отработки функций LinearRegression и Diverg по каждому ТФ и потом вывести их одним комментарием, можно в несколько строк.
Только есть ограничения по длине строки. Можно воспользоватся функцией от Александра Пака. Если не найдете, то поищу у себя
Уважаемые господа!
Возник вопрос по передаче массива по ссылке.
Схема алгоритма следующая:
Из одной библиотеки в другую передаём массив по ссылке.
Там его копируем через встроенную функцию:
ArrayCopy.
Далее, переданный по ссылке массив уже используем
в первом модуле.
Но почему-то возникает ошибка, причём не всегда.
Т.е. то происходит копирование, то нет.
В чём причина?
Запись в логах следующая:
21:07:12 openHistory CADCHF,H1:
incompatible 2 arrays ranges for ArrayCopy function (0 and 4)
Это потому что Вы неправильно скопировали мой пример. Посмотрите внимательно где i, а где к.
Код исправил в соответствии с вашим.
При тестировании четыре ордера закрылись в порядке установки на первом тике, пятый - на следующем. Вероятно, здесь что-то ещё не так т.к. тестировал неоднократно.
Код программы и записи из журнала тестера привожу.
С уважением. Shurkin
Зациклить старт надо. Внутри цикла работать. Там всё можно.
это немного не то. когда пропадет связь, в журнале пишет "Ping failed". значит есть ф-ии, но они почему-то не документированы.
а при зацикленном насколько увеличивается нагрузка на проц и память?
Доброго вечера! Прошу прощения, хочу вернуться к нерешоной задаче.
'Buy' - incompatible types D:\TeleTRADE\experts\чистовариант.mq4 (102, 53)
'Sell' - incompatible types D:\TeleTRADE\experts\чистовариант.mq4 (102, 79)
Эта строка не компилируется.