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

 

DiPach , еще раз спасибо за помощь. Проанализировал Ваши примеры. Внес изменения в свой стартовый код. Получилось вот что:

void OnStart()
  {
int awd1[];
ArrayResize(awd1,6,7);
   for(int i=0;i<=5;i++)
   {
   awd1[i]=i+10;
   Print("awd1[", i, "]=", awd1[i]);
   }
   Alert("awd1[0]=", awd1[0], ", awd1[1]=", awd1[1], ", awd1[2]=", awd1[2], 
   ", awd1[3]=", awd1[3], ", awd1[4]=", awd1[4], ", awd1[5]=", awd1[5]);
  }

Что было изменено:

1. Перенес строку с объявлением массива int awd1[]; внутрь функции OnStart()

2. Добавил функцию ArrayResize(awd1,6,7);

3. Скрипт заработал.

Попытаюсь сделать выводы. В скриптах массивы корректно объявлять внутри функции OnStart(). После объявления массива ему обязательно нужно определить размер функцией ArrayResize(), иначе компилятор будет ругаться. Мои выводы верны? Если нет, то подскажите, пожалуйста, правильную трактовку.

 
silachara:

DiPach , еще раз спасибо за помощь. Проанализировал Ваши примеры. Внес изменения в свой стартовый код. Получилось вот что:

Что было изменено:

1. Перенес строку с объявлением массива int awd1[]; внутрь функции OnStart()

2. Добавил функцию ArrayResize(awd1,6,7);

3. Скрипт заработал.

Попытаюсь сделать выводы. В скриптах массивы корректно объявлять внутри функции OnStart(). После объявления массива ему обязательно нужно определить размер функцией ArrayResize(), иначе компилятор будет ругаться. Мои выводы верны? Если нет, то подскажите, пожалуйста, правильную трактовку.

В общем-то, да. И ругаться будет хоть тихо, но конкретно. :)

Уточню лишь следующие моменты:

1. При объявлении обычных переменных и массивов, думаю, нужно исходить из того, что будет выполнять этот скрипт(или советник/индикатор) и для чего предназначены эти переменные/ массивы.

Вами прилагаемая схема работы скрипта вполне, полагаю, допускает объявление переменных не на глобальном уровне программы, а так локально. Т.е., объявление массива происходит разово. И не происходит не требуемых повторных(зацикленных) объявлений  в теле Start() в коде, о котором говорим, к примеру, на участке до начала цикла for(), и, например, при надобности объявления каких-то переменных далее, на участке после выхода из for() {}:


Соответственно, то, что массив разово объявляется не на уровне глобальных переменных программы, а в теле OnStart(), но до оператора цикла for() - это вполне приемлимо в такой схеме работы программы.

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

2. По коду же уточню следующее:

void OnStart()
  {
   int awd1[];
   ArrayResize(awd1,6,7);
   for(int i=0;i<6;i++)
     {
      awd1[i]=i+10;
      Print("awd1[",i,"]=",awd1[i]);
     }
   string text=StringConcatenate("awd1[0]=",awd1[0],", awd1[1]=",awd1[1],", awd1[2]=",awd1[2],
                                 ", awd1[3]=",awd1[3],", awd1[4]=",awd1[4],", awd1[5]=",awd1[5]);
   Alert(text);
  }

То бишь:

  • Не стоит применять знак <= (меньше равно) в for. Имею в виду, где было (i=0;i<=5;i++). Просто поставьте знак <(меньше), а вместо 5, цифру 6:
for(int i=0;i<6;i++)

Вот в таком варианте 5 будет подходить для for:

for(int i=5;i>=0;i--)
  • Помню раньше встречала инфу, что функция Stringconcatenate способствует более быстрой обработке длинного текста. Поэтому у себя обычно её применяю. Вот включила и тут, так, на всякий случай.


P./S.: Ещё одно уточнение, на всякий случай, применение ArrayResize() - для динамических массивов. В Документации к этой функции есть инфа, когда нельзя изменять размер для динамических массивов этой функцией.

 
Best_ATS:
Почему я не могу добавлять друзей?
А как Вы представляете себе друга, не зная его лично в жизни, по работе?
 

Добрый день! Как можно сделать так что бы новая цена показывалась первой а предыдущая цена опустилась в низ и так дали? Что бы било понятно сделал пример.

double NN=0;
double NN1=0;
double NN2=0;
double NN3=0;
void OnTick()
  {
//---
if(Ask>NN)NN=Ask;
if(NN>NN1)NN1=NN;
if(NN1>NN2)NN2=NN1;
if(NN2>NN3)NN3=NN2;
        Comment(""       
             + "1.   "+"Buy: "" Max: " + DoubleToStr(NN,5)
             + "\n"  
             + "2.   "+"Buy: "" Max: " + DoubleToStr(NN1,5)
             + "\n"  
             + "3.   "+"Buy: "" Max: " + DoubleToStr(NN2,5)
             + "\n"  
             + "4.   "+"Buy: "" Max: " + DoubleToStr(NN3,5)
             + "\n"
             + "------------------------------------------------" );
           
  }
 
abeiks:

Добрый день! Как можно сделать так что бы новая цена показывалась первой а предыдущая цена опустилась в низ и так дали? Что бы било понятно сделал пример.

Сделал пример, а с условиями больше-меньше сами разберётесь:

double bda_Price[4];
void OnTick()
{
      int li_int;
//---
    if (Ask > bda_Price[0])
    {
        ArrayInitialize (bda_Price, 0.);
        bda_Price[0] = Ask;
        double lda_Price[3];
        ArrayCopy (lda_Price, bda_Price, 0, 1);
        for (int li_int = 1; li_int < 4; li_int++)
        {bda_Price[li_int] = lda_Price[li_int-1];}
    }
    string ls_txt;
    StringInit (ls_txt, 100);
    for (li_int = 0; li_int < 4; li_int++)
    {ls_txt = StringConcatenate (ls_txt, (string) li_int, ".   Buy:  Max: ", DoubleToStr (bda_Price[li_int], Digits), "\n");
    ls_txt = StringConcatenate (ls_txt, "------------------------------------------------" );
    Comment (ls_txt);
//---
}
 
TarasBY:

Сделал пример, а с условиями больше-меньше сами разберётесь:


Спасибо!
 
abeiks:

Добрый день! Как можно сделать так что бы новая цена показывалась первой а предыдущая цена опустилась в низ и так дали? Что бы било понятно сделал пример.

Вот сделал совершенно примитивный код.

double Price1, Price2, Price3, Price4;

void OnTick()
  {
Price4=Price3;
Price3=Price2;
Price2=Price1;
Price1=Ask;
Comment(Price1, "\n", Price2, "\n", Price3, "\n", Price4);
  }
 
silachara:

Вот сделал совершенно примитивный код.




Спасибо!
 

Всем привет. Пробовал открыть торговый ордер в тестере стратегий с помощью элементарного скрипта, не получилось.

int start()

  {

//----

   int res;

   double ask=Close[0]+MarketInfo(_Symbol,MODE_SPREAD)*Point;

   res=OrderSend(Symbol(),OP_BUY,0.1,ask,3,0,0,"",0,0,Blue);

   if(res>-1)Alert("Открыт ордер BUY с тикетом ",res);

//----

   return(0);

  } 

Бросаю скрипт на график тестера в режиме визуализации, но торговый ордер открывается в терминале MT4.

Так же не получается получать информацию об открытых ордерах  с помощью SimpleFXTester_v2.ex4 в тестере стратегий. 

Огромная просьба помочь разобраться . 

 
kosmos0975:

Всем привет. Пробовал открыть торговый ордер в тестере стратегий с помощью элементарного скрипта, не получилось.

int start()

  {

//----

   int res;

   double ask=Close[0]+MarketInfo(_Symbol,MODE_SPREAD)*Point;

   res=OrderSend(Symbol(),OP_BUY,0.1,ask,3,0,0,"",0,0,Blue);

   if(res>-1)Alert("Открыт ордер BUY с тикетом ",res);

//----

   return(0);

  } 

Бросаю скрипт на график тестера в режиме визуализации, но торговый ордер открывается в терминале MT4.

Так же не получается получать информацию об открытых ордерах  с помощью SimpleFXTester_v2.ex4 в тестере стратегий. 

Огромная просьба помочь разобраться . 

 

Скрипты в тестере не работают.