Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 349

 
Pyro:

При инициализации сбрасывается всё, кроме Global Variables
А если просто комп выключить или сервер вырубится на котором советник?
 
artmedia70:
И тут нужно уточнить, что GV - это переменные терминала, а не советника.

Начал читать и изучать. Теперь знаю что глобальные переменные и Global Variables разные вещи.

Кстати на счет ошибки 129, про которую у Вас так часто спрашивал. Дело в том, что у меня ДЦ пятизнак,

а советнике слипейдж 2, скорее всего поэтому советник за ценой не успевал. Теперь поставлю 15 пунктов.

 
artmedia70:
И тут нужно уточнить, что GV - это переменные терминала, а не советника.


Ну я в том смысле, что советник с ними может работать, как раз для сохранения значений при инициализации (в том числе).
 
Forexman77:
А если просто комп выключить или сервер вырубится на котором советник?


Тут интересно. Global Variables хранятся в кэше и при каких-то обстоятельствах пишутся в файл. Вроде как через определенное время или при деинициализации. При реальной работе бывали случаи, что при резкой перезагрузке компа просто терялся gvariables.dat (файл в котором хранятся значения Global Variables). Это нужно учитывать, при работе. Ну или просто они не успели прописаться на диск из кэша. Тоесть гарантий нет, что они уже на диске а не в кэше. Поправьте меня, если ошибаюсь.


Forexman77:

Начал читать и изучать. Теперь знаю что глобальные переменные и Global Variables разные вещи.

Кстати на счет ошибки 129, про которую у Вас так часто спрашивал. Дело в том, что у меня ДЦ пятизнак,

а советнике слипейдж 2, скорее всего поэтому советник за ценой не успевал. Теперь поставлю 15 пунктов.


Врядли из-за этого. У меня на пятизнаке стоит 3. Всё открывается нормально. Насколько я помню, брокеры договорились что пункт - это всё же базовый пункт, принятый повсеместно (4-я цифра после нуля) а дробность пункта это дробность. Чтобы впоследствии при вводе 6,7 и 8-знака, каждый раз не менялся смысл понятия "пункт".
 
Pyro:

Тут интересно. Global Variables хранятся в кэше и при каких-то обстоятельствах пишутся на в файл. Вроде как через определенное время. При реальной работе бывали случаи, что при резкой перезагрузке компа просто терялся gvariables.dat (файл в котором хранятся значения Global Variables). Это нужно учитывать, при работе. Ну или просто они не успели прописаться на диск из кэша. Тоесть гарантий нет, что они уже на диске а не в кэше. Поправьте меня, если ошибаюсь.
Может можно попробовать записать ее, потом выключить комп. И при включении попробовать Alert вызвать, на предмет наличия. Хотя врать не буду, пока пользуюсь только статическими переменными и флагами и ничего точно сказать Global Variables про не могу.
 
Forexman77:
Может можно попробовать записать ее, потом выключить комп. И при включении попробовать Alert вызвать, на предмет наличия. Хотя врать не буду, пока пользуюсь только статическими переменными и флагами и ничего точно сказать Global Variables про не могу.


Можно просто посмотреть в меню -> Сервис -> Глобальные переменные. Там есть список. Ну или GlobalVariableCheck-ом. Я по опыту понял, что лучше все сохранять в физический файл все же.
 
Здравствуйте!
Найдите пожалуйста ошибки в моих рассуждениях.

Вот и заканчивается второй день, как я бьюсь над созданием индикатора, а именно над отображением линии на дополнительном окне, которое прикреплено к основному. Мое мнение, необходимо провести вычисления над не подсчитанными барами и дать значения результатов вычислений буферу. На этот раз, использую для примера более сложный код (мне приятно работать с относительно огромными кодами). Вот "полянка творчества" :

//+--------------------------------------------+
#property indicator_separate_window
#property indicator_minimum -10
#property indicator_maximum 10
#property indicator_buffers 1
#property indicator_color1 Blue
extern double N = 1;
//+--------------------------------------------+
//Deklaration                                  |
//+--------------------------------------------+
double A; double C;       
double M; double D;
double L; double I;
double B; double F;
double K; double Buf_0[];
double G; 
//+--------------------------------------------+
int init(){
SetIndexBuffer(0,Buf_0);
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
return; }
//+--------------------------------------------+
int start() {
//Level 1
A = iRSI(Symbol(),0,10,0,0);
M = iRSI(Symbol(),0,20,0,0);
L = iRSI(Symbol(),0,15,0,0);
B = iStochastic(Symbol(),0,10,6,6,0,0,0,0);
K = iStochastic(Symbol(),0,10,6,6,0,0,1,0);
C = iADX(Symbol(),0,10,0,0,0);
D = iADX(Symbol(),0,10,0,1,0);
I = iADX(Symbol(),0,10,0,2,0);
F = iRVI(Symbol(),0,10,0,0);
  //Level 2
  Buf_0[0] = N *(((B + F) / K) - ((D + I) / C) + ((A + M) / L));
  return; } 
//+-------------------------------------------+ 

.

Хорошо видно, что "на данной поляночке" значение буфера равно "0", т.е. этот индикатор будет рисовать линию только с момента запуска торговой платформы. А мне нужны, помимо действительных данных, исторические.

Я использовал информацию, описанную в этом коде (взял из учебника по MQ4):

//--------------------------------------------------------------------
// separatewindow.mq4 
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
#property indicator_separate_window // Отображение в отдельном окне
#property indicator_buffers 1       // Количество буферов
#property indicator_color1 Blue     // Цвет первой линии
#property indicator_color2 Red      // Цвет второй линии
 
extern int History  =50;            // Колич.баров в расчётной истории
extern int Aver_Bars=5;             // Количество баров для расчёта
 
double Buf_0[];                     // Объявление индикаторного массива
//--------------------------------------------------------------------
int init()                          // Специальная функция init()
  {
   SetIndexBuffer(0,Buf_0);         // Назначение массива буферу
   SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2);// Стиль линии
   return;                          // Выход из спец. ф-ии init()
  }
//--------------------------------------------------------------------
int start()                         // Специальная функция start()
  {
   int i,                           // Индекс бара
   n,                               // Формальный параметр
   Counted_bars;                    // Количество просчитанных баров 
   double
   Sum_H,                           // Сумма значений High за период
   Sum_L;                           // Сумма значений Low  за период
//--------------------------------------------------------------------
   Counted_bars=IndicatorCounted(); // Количество просчитанных баров 
   i=Bars-Counted_bars-1;           // Индекс первого непосчитанного
   if (i>History-1)                 // Если много баров то ..
      i=History-1;                  // ..рассчитывать заданное колич.
   while(i>=0)                      // Цикл по непосчитанным барам
     {
      Sum_H=0;                      // Обнуление в начале цикла
      Sum_L=0;                      // Обнуление в начале цикла
      for(n=i;n<=i+Aver_Bars-1;n++) // Цикл суммирования значений 
        {
         Sum_H=Sum_H + High[n];     // Накопление суммы макс.значений
         Sum_L=Sum_L + Low[n];      // Накопление суммы мин. значений
        }
      Buf_0[i]=(Sum_H-Sum_L)/Aver_Bars;// Знач. 0 буфера на i-ом баре
      i--;                          // Расчёт индекса следующего бара
     }
//--------------------------------------------------------------------
   return;                          // Выход из спец. ф-ии start()
  }
//--------------------------------------------------------------------
Вычленю надобное мне и получу...
extern int History  =50;            // Колич.баров в расчётной истории
extern int Aver_Bars=5;             // Количество баров для расчёта
double Buf_0[];                     // Объявление индикаторного массива
int start()                         // Специальная функция start()
  {
   int i,                           // Индекс бара
   n,                               // Формальный параметр
   Counted_bars;                    // Количество просчитанных баров 
   Counted_bars=IndicatorCounted(); // Количество просчитанных баров 
   i=Bars-Counted_bars-1;           // Индекс первого непосчитанного
   if (i>History-1)                 // Если много баров то ..
      i=History-1;                  // ..рассчитывать заданное колич.
      Buf_0[i]=(Sum_H-Sum_L)/Aver_Bars;// Знач. 0 буфера на i-ом баре
      i--;  

Затем, привожу к "парадному виду", удалив комментарии и разделив логически, получаю:

//|+--------------------------------------+
//|Inputs                                 |
//|+--------------------------------------+
extern int History  =50;
//|+--------------------------------------+
//|Declaration                            |
//|+--------------------------------------+
double Buf_0[];
int i;
int n;
int Counted_bars;
//|+--------------------------------------+
//| Start?                                |
//| Yes, babe!                            |
//|+--------------------------------------+
int start(){
//+-----------+
//Level 1 
//+-----------+
Counted_bars=IndicatorCounted();
i=Bars-Counted_bars-1;
  //+-----------+
  //Level 2
  //+-----------+
  if (i>History-1) i=History-1;
    //+------------+
    //Level 3 
    //+------------+
    Buf_0[i]= 
    i--;  
//+---------------------------------------+

Вот и остался я с объектами, которые необходимо синтезировать с "главным" кодом. Выполнив слияние, получаю такой код:

//+--------------------------------------------+
#property indicator_separate_window
#property indicator_minimum -10
#property indicator_maximum 10
#property indicator_buffers 1
#property indicator_color1 Blue
//|+--------------------------------------------+
//|Inputs                                       |
//|+--------------------------------------------+
extern double N = 1;
extern int History  =50;
//|+--------------------------------------------+
//|Deklaration                                  |
//|+--------------------------------------------+
double A; double C;       int i;
double M; double D;
double L; double I;       int Counted_bars;
double B; double F;
double K; double Buf_0[];
double G; 
//|+--------------------------------------------+
int init(){
SetIndexBuffer(0,Buf_0);
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
return; }
//|+--------------------------------------------+
int start() {
       //|+-----------+
       //|Level 1     |
       //|+-----------+
       A = iRSI(Symbol(),0,10,0,0);
       M = iRSI(Symbol(),0,20,0,0);
       L = iRSI(Symbol(),0,15,0,0);
B = iStochastic(Symbol(),0,10,6,6,0,0,0,0);
K = iStochastic(Symbol(),0,10,6,6,0,0,1,0);
       C = iADX(Symbol(),0,10,0,0,0);
       D = iADX(Symbol(),0,10,0,1,0);
       I = iADX(Symbol(),0,10,0,2,0);
       F = iRVI(Symbol(),0,10,0,0);
   Counted_bars=IndicatorCounted();
              i=Bars-Counted_bars-1;
         //+-----------+
         //Level 2     |
         //+-----------+
         if (i>History-1) i=History-1;
         Buf_0[i] = N *(((B + F) / K) - ((D + I) / C) + ((A + M) / L));
         return; } 
//+-------------------------------------------+
Входе программирования, я декоративно изменил "главный" код и убрал некие значения из "придаточного". Запустив код в работу, обратил внимание на горизонтальную линию, которая свидетельствовала о ошибке в ходе рассуждений, ибо технические индикаторы, используемые в пользовательском индикаторе, не могут давать, на протяжении длительного промежутка времени, значения, выстроившие график функции " y = x ".

Справка.
Зовут меня Джон (Евгений, но на Американский лад).

Мне 15 лет, занимаюсь трейдингом 5 день и чувствую огромный прогресс в изучении областей ведения валютного дилинга, а именно индикаторного анализа и графического анализа (короче, т.а. :) ).
Чувствую, что "ручной торг" становится все менее перспективным, потому решил сразу перейти на "автоматизированный торг".

"ПРИДЕРАЙТЕСЬ" КО ВСЕМ НЕАДЕКВАТНЫМ СУЖДЕНИЯМ! Я хочу знать больше, а ваши комментарии мне помогут.

 
Link_x:
Здравствуйте!
Найдите пожалуйста ошибки в моих рассуждениях.

Вот и заканчивается второй день, как я бьюсь над созданием индикатора, а именно над отображением линии на дополнительном окне, которое прикреплено к основному. Мое мнение, необходимо провести вычисления над не подсчитанными барами и дать значения результатов вычислений буферу. На этот раз, использую для примера более сложный код (мне приятно работать с относительно огромными кодами). Вот "полянка творчества" :

.

Хорошо видно, что "на данной поляночке" значение буфера равно "0", т.е. этот индикатор будет рисовать линию только с момента запуска торговой платформы. А мне нужны, помимо действительных данных, исторические.

Я использовал информацию, описанную в этом коде (взял из учебника по MQ4):

Вычленю надобное мне и получу...

Затем, привожу к "парадному виду", удалив комментарии и разделив логически, получаю:

Вот и остался я с объектами, которые необходимо синтезировать с "главным" кодом. Выполнив слияние, получаю такой код:

Входе программирования, я декоративно изменил "главный" код и убрал некие значения из "придаточного". Запустив код в работу, обратил внимание на горизонтальную линию, которая свидетельствовала о ошибке в ходе рассуждений, ибо технические индикаторы, используемые в пользовательском индикаторе, не могут давать, на протяжении длительного промежутка времени, значения, выстроившие график функции " y = x ".

Справка.
Зовут меня Джон (Евгений, но на Американский лад).

Мне 15 лет, занимаюсь трейдингом 5 день и чувствую огромный прогресс в изучении областей ведения валютного дилинга, а именно индикаторного анализа и графического анализа (короче, т.а. :) ).
Чувствую, что "ручной торг" становится все менее перспективным, потому решил сразу перейти на "автоматизированный торг".

"ПРИДЕРАЙТЕСЬ" КО ВСЕМ НЕАДЕКВАТНЫМ СУЖДЕНИЯМ! Я хочу знать больше, а ваши комментарии мне помогут.

Начяло хорошее.

Обрати внимание на переменную History, попробуй подставить другое значение.

//                Джон(Евгений).mq4 

//+--------------------------------------------+
#property indicator_separate_window
//#property indicator_minimum -10
//#property indicator_maximum 10
#property indicator_buffers 1
#property indicator_color1 Blue
//|+--------------------------------------------+
//|Inputs                                       |
//|+--------------------------------------------+
extern double N = 1;
extern int History  =50;
//|+--------------------------------------------+
//|Deklaration                                  |
//|+--------------------------------------------+
double A; double C;       int i;
double M; double D;
double L; double I;       int Counted_bars;
double B; double F;
double K; double Buf_0[];
double G; 
//|+--------------------------------------------+
int init(){
SetIndexBuffer(0,Buf_0);
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
return; }
//|+--------------------------------------------+
int start()
{
       //|+-----------+
       //|Level 1     |
       //|+-----------+
 for( i=0; i<History; i++)
    {    
       A = iRSI(Symbol(),0,10,0,i);
       M = iRSI(Symbol(),0,20,0,i);
       L = iRSI(Symbol(),0,15,0,0);
       B = iStochastic(Symbol(),0,10,6,6,0,0,0,i);
       K = iStochastic(Symbol(),0,10,6,6,0,0,1,i);
       C = iADX(Symbol(),0,10,0,0,i);
       D = iADX(Symbol(),0,10,0,1,i);
       I = iADX(Symbol(),0,10,0,2,i);
       F = iRVI(Symbol(),0,10,0,i);
    Buf_0[i] = N *(((B + F) / K) - ((D + I) / C) + ((A + M) / L));
   }
 return;
} 
//+-------------------------------------------+
 
Link_x:
Здравствуйте!
Найдите пожалуйста ошибки в моих рассуждениях.

Вот и заканчивается второй день, как я бьюсь над созданием индикатора, а именно над отображением линии на дополнительном окне, которое прикреплено к основному. Мое мнение, необходимо провести вычисления над не подсчитанными барами и дать значения результатов вычислений буферу. На этот раз, использую для примера более сложный код (мне приятно работать с относительно огромными кодами). Вот "полянка творчества" :

.

Хорошо видно, что "на данной поляночке" значение буфера равно "0", т.е. этот индикатор будет рисовать линию только с момента запуска торговой платформы. А мне нужны, помимо действительных данных, исторические.

Я использовал информацию, описанную в этом коде (взял из учебника по MQ4):

Вычленю надобное мне и получу...

Затем, привожу к "парадному виду", удалив комментарии и разделив логически, получаю:

Вот и остался я с объектами, которые необходимо синтезировать с "главным" кодом. Выполнив слияние, получаю такой код:

Входе программирования, я декоративно изменил "главный" код и убрал некие значения из "придаточного". Запустив код в работу, обратил внимание на горизонтальную линию, которая свидетельствовала о ошибке в ходе рассуждений, ибо технические индикаторы, используемые в пользовательском индикаторе, не могут давать, на протяжении длительного промежутка времени, значения, выстроившие график функции " y = x ".

Справка.
Зовут меня Джон (Евгений, но на Американский лад).

Мне 15 лет, занимаюсь трейдингом 5 день и чувствую огромный прогресс в изучении областей ведения валютного дилинга, а именно индикаторного анализа и графического анализа (короче, т.а. :) ).
Чувствую, что "ручной торг" становится все менее перспективным, потому решил сразу перейти на "автоматизированный торг".

"ПРИДЕРАЙТЕСЬ" КО ВСЕМ НЕАДЕКВАТНЫМ СУЖДЕНИЯМ! Я хочу знать больше, а ваши комментарии мне помогут.


Начинай копать в сторону циклов (for, wile, while do) на предмет зачем оно надо ваще )))


Если нужны значения на исторических данных - без перебора этих самых данных в цикле никак ;)

Выше давали пример с History, задающей кол-во баров истории, которые будут обработаны индикатором, вот от этого и пляши.

 


На картинке стрелкой обозначил, где должен быть выход. Не пойму в чем дело. Входим запоминаем время,

потом выходим когда время больше чем на входе со сдвигом на один период и цена ниже 3 дневной МА мин.

Код следующий:

signal =   MA_6_t - iClose(Symbol(),Period(),0);
MA_2_t=iMA(NULL,0,3,0,MODE_EMA,PRICE_LOW,0); 
static datetime t;

if  (signal > 0.006) 
          {                                          
          Opn_S=true; 
          t=Time[0];                      
          }
if  (Bid <= MA_2_t)
      {
       if (Time[1]>t)
          {                                      
          Cls_S=true;         
          }
      }
Что подскажете?