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

capricornsuper  

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(), иначе компилятор будет ругаться. Мои выводы верны? Если нет, то подскажите, пожалуйста, правильную трактовку.

Dina Paches  
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() - для динамических массивов. В Документации к этой функции есть инфа, когда нельзя изменять размер для динамических массивов этой функцией.

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

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

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"
             + "------------------------------------------------" );
           
  }
TarasBY  
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);
//---
}
Nauris Zukas  
TarasBY:

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


Спасибо!
capricornsuper  
abeiks:

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

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

double Price1, Price2, Price3, Price4;

void OnTick()
  {
Price4=Price3;
Price3=Price2;
Price2=Price1;
Price1=Ask;
Comment(Price1, "\n", Price2, "\n", Price3, "\n", Price4);
  }
Nauris Zukas  
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 в тестере стратегий. 

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

Alexey Viktorov  
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 в тестере стратегий. 

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

 

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