[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 227

 

Уважаемые коллеги-профессионалы, нужна ваша помощь (пли-и-из). В советнике хочу сделать функцию, которая выводит уведомление в вернем углу экрана о текущем тренде на разных таймфреймах и предстоящем развороте. Для этого использую свои функции 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);
 }

 
Optim:

Уважаемые коллеги-профессионалы, нужна ваша помощь (пли-и-из). В советнике хочу сделать функцию, которая выводит уведомление в вернем углу экрана о текущем тренде на разных таймфреймах и предстоящем развороте. Для этого использую свои функции 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);
 }


void Comment(...)
Функция выводит комментарий, определенный пользователем, в левый верхний угол графика. Параметры могут иметь любой тип. Количество параметров не может превышать 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 по каждому ТФ и потом вывести их одним комментарием, можно в несколько строк.

 
Optim:

Спасибо. Я понял. Мне нужно ввести переменные по результатам отработки функций LinearRegression и Diverg по каждому ТФ и потом вывести их одним комментарием, можно в несколько строк.


Только есть ограничения по длине строки. Можно воспользоватся функцией от Александра Пака. Если не найдете, то поищу у себя
 

Уважаемые господа!

Возник вопрос по передаче массива по ссылке.

Схема алгоритма следующая:

Из одной библиотеки в другую передаём массив по ссылке.

 Там его копируем через встроенную функцию:

 ArrayCopy.

 Далее, переданный по ссылке массив уже используем

в первом модуле.

Но почему-то возникает ошибка, причём не всегда.

Т.е. то происходит копирование, то нет.

В чём причина?

Запись в логах следующая:

21:07:12 openHistory CADCHF,H1:

 incompatible 2 arrays ranges for ArrayCopy function (0 and 4)

Подключаем модуль

Копируем

 
Roger:
Это потому что Вы неправильно скопировали  мой пример. Посмотрите внимательно где i, а где к.

Код исправил в соответствии с вашим.
При тестировании четыре ордера закрылись в порядке установки на первом тике, пятый - на следующем. Вероятно, здесь что-то ещё не так т.к. тестировал неоднократно.
Код программы и записи из журнала тестера привожу.
С уважением. Shurkin

Код программы.
//+------------------------------------------------------------------+
//|                                                     Poligon1.mq4 |
//|                                            21 февраля 2013 года. |
//|Тестирование оператора цикла for.                                 |
//+------------------------------------------------------------------+
#property copyright "21 февраля 2013 года."
#property link      ""
//+------------------------------------------------------------------+
//|Объявленные переменные                                            |
//+------------------------------------------------------------------+
int Mn=357;//Magic number
int 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_BUY
OrderSend(Symbol(),OP_BUY,1,Ask,0,NormalizeDouble(Bid-25*Point,Digits),
NormalizeDouble(Ask+25*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,1.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,2.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,3.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(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_BUYLIMIT
OrderSend(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;//PriTP
   Print("Кс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.18 13:58:21     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=4 i=1 k=1
2013.03.18 13:58:21     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=4 i=0 k=0
2013.03.18 13:57:57     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=3 i=1 k=1
2013.03.18 13:57:57     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=3 i=0 k=0
2013.03.18 13:57:33     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=2 i=1 k=0
2013.03.18 13:57:33     2013.02.11 12:15  Poligon1 EURUSD,M15: close #5 buy 3.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3394
2013.03.18 13:57:33     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=2 i=0 k=0
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: close #4 buy 2.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=1 i=3 k=0
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: close #3 buy 1.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=1 i=2 k=0
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: close #2 buy 1.00 EURUSD at 1.3397 sl: 1.3370 tp: 1.3422 at price 1.3395
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=1 i=1 k=0
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: close #1 buy 0.50 EURUSD at 1.3397 sl: 1.3360 tp: 1.3432 at price 1.3395
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ1: Tick=1 i=0 k=0
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: Êñ0: OrdersTotal=7
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: open #7 sell stop 3.00 EURUSD at 1.3367 sl: 1.3410 tp: 1.3322 ok
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: open #6 buy limit 1.00 EURUSD at 1.3382 sl: 1.3355 tp: 1.3422 ok
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: open #5 buy 3.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: open #4 buy 2.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: open #3 buy 1.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: open #2 buy 1.00 EURUSD at 1.3397 sl: 1.3370 tp: 1.3422 ok
2013.03.18 13:57:09     2013.02.11 12:15  Poligon1 EURUSD,M15: open #1 buy 0.50 EURUSD at 1.3397 sl: 1.3360 tp: 1.3432 ok
2013.03.18 13:57:09     Poligon1 test started
2013.03.18 13: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". значит есть ф-ии, но они почему-то не документированы.
а  при зацикленном насколько увеличивается нагрузка на проц и память? 

 
Dimka-novitsek:

Доброго вечера! Прошу прощения, хочу вернуться к нерешоной задаче. 

 'Buy' - incompatible types D:\TeleTRADE\experts\чистовариант.mq4 (102, 53)

 'Sell' - incompatible types D:\TeleTRADE\experts\чистовариант.mq4 (102, 79)

 


if (!Pishem&&PozyProstavleny){SaveArray(FileBuy, Buy); SaveArray(FileSell, Sell); Pishem=1;}

 Эта строка не компилируется.