Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1422

 
andrey46:
Кто знает почему советник в тестере работает прекрасно, выставляет заявки и т д , а на реальном счету , заявки не выставляются хотя робот активный

Нужно читать журнал, там может быть ответ

 

Подскажите пожалуйста , как из этого -

double w = 18.2

получить это -

int w = 18
 
TrederMT5:

Подскажите пожалуйста , как из этого -

получить это -

int w1;
double w = 18.2;
w1=(int)w;
w=round (w);

Явное приведение типа.

А еще можно целое (round) от не целого., но в дабл будет 18.0

 
scomoroh:

Тогда продублирую вопрос.

выражение

if (izmb>b ||izmb<b || izms>s || izms<s)

тождественно этому:

if (izmb!=b || izms!=s)

 А если Вы хотите что-то сохранить, то сделайте это в глобальной переменной.

Эта та, которая объявляется вне тела функции.

int izmb=0, izms=0;


void OnTick()
   {
   .........
 
Valeriy Yastremskiy:


Спасибо
 

Всем доброго времени суток! 

Вопрос по MQL4. Вот простой код

double LoY[31][31],LoU,LoU1;
int S,S1,S2;
void OnTick()
{
if (Minute()==20&&Minute()!=S1)
{
ArrayFill(LoY,0,31,0.5555);
S1=Minute();
}
//***************************************************************
if (Minute()!=S)
{
LoY[0][0]=Bid;
ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);
Print("----LoY[0][1]-- Горизонтально ---  [0}  ",  LoY[0][0],"  [1] ",   LoY[0][1],"  [2] ",   LoY[0][2],"  [3] ",   LoY[0][3],"  [4] ",   LoY[0][4],"  [26] ",   LoY[0][26],"  [27] ",   LoY[0][27],"  [28] ",   LoY[0][28],"  [29] ",   LoY[0][29],"  [30] ",   LoY[0][30]);
Print("----LoY[1][0]-- Вертикалььно ---  [0}  ",  LoY[0][0],"  [1] ",   LoY[1][0],"  [2] ",   LoY[2][0],"  [3] ",   LoY[3][0],"  [4] ",   LoY[4][0],"  [26] ",   LoY[26][0],"  [27] ",   LoY[27][0],"  [28] ",   LoY[28][0],"  [29] ",   LoY[29][0],"  [30] ",   LoY[30][0]);
S=Minute();
}
}

В нем создается двумерный массив и программа заполняет его значениями. В коде две интересующие меня  функции  ArrayFill(LoY,0,31,0.5555); и ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND); Судя по Справочнику обе работают с двумерными массивами.  ArrayFill() работает строго с массивами заполненными по горизонтали , в Справочнике указывается , что она заполняет массивы значениями строго слева направо (а не сверху вниз или снизу вверх).  ArraySort() сортирует двумерный массив по первому измерению. В Справочнике не говориться сортирует он горизонтально заполненные массивы или вертикально заполненные. Судя по исполнению моего кода  ArraySort() сортирует только вертикально заполненные массивы. Кажется , что  эти две функции не могут работать с одним и тем же массивом  в одной программе. 

ВОПРОС. Для меня важно что бы корректно работала функция  ArraySort()  Исходя из этого можно ли настроить  ArraySort() на то что бы она сортировала горизонтально заполненные массивы, с которыми работает  ArrayFill()? Или вместо нее мне может помочь функция сортировки из MQL5, которая работает на  MQL4? Или есть функция , которая преобразует горизонтально заполненный массив со всеми его значениями в вертикальный.  Одним словом как заставить мою программу сортировать массив по горизонтали

Примечание. Вместо   ArrayFill()  использовать цикл - мне не подходит.

Спасибо за помощь

 
ANDREY:

Всем доброго времени суток! 

Вопрос по MQL4. Вот простой код

В нем создается двумерный массив и программа заполняет его значениями. В коде две интересующие меня  функции  ArrayFill(LoY,0,31,0.5555); и ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND); Судя по Справочнику обе работают с двумерными массивами.  ArrayFill() работает строго с массивами заполненными по горизонтали , в Справочнике указывается , что она заполняет массивы значениями строго слева направо (а не сверху вниз или снизу вверх).  ArraySort() сортирует двумерный массив по первому измерению. В Справочнике не говориться сортирует он горизонтально заполненные массивы или вертикально заполненные. Судя по исполнению моего кода  ArraySort() сортирует только вертикально заполненные массивы. Кажется , что  эти две функции не могут работать с одним и тем же массивом  в одной программе. 

ВОПРОС. Для меня важно что бы корректно работала функция  ArraySort()  Исходя из этого можно ли настроить  ArraySort() на то что бы она сортировала горизонтально заполненные массивы, с которыми работает  ArrayFill()? Или вместо нее мне может помочь функция сортировки из MQL5, которая работает на  MQL4? Или есть функция , которая преобразует горизонтально заполненный массив со всеми его значениями в вертикальный.  Одним словом как заставить мою программу сортировать массив по горизонтали

Примечание. Вместо   ArrayFill()  использовать цикл - мне не подходит.

Спасибо за помощь

Вы обратили внимание на

примечание

ArrayFill

Многомерный массив при обработке функцией ArrayFill() представляется одномерным, например, массив array[2][4] обрабатывается как array[8], поэтому при работе с этим массивом допустимо указать индекс начального элемента равным 5. Таким образом, вызов ArrayFill(array, 5, 2, 3.14) для массива array[2][4] заполнит значением 3.14 элементы массива array[1][1] и array[1][2].


Эта строка

ArrayFill(LoY,0,31,0.5555);

заполнит массив ровно одну строку.

Что касается вертикальности\горизонтальности, это как вы будете держать голову глядя на запись. Посмотрите на таблицу Excell и всё станет понятно. Если столбец «А» заполнить значениями, то получится одномерный массив. Как он расположен? Правильно… горизонтально, потому, что я смотрю на это лёжа на диване………

 
Alexey Viktorov:

Вы обратили внимание на

примечание

Эта строка

заполнит массив ровно одну строку.

Что касается вертикальности\горизонтальности, это как вы будете держать голову глядя на запись. Посмотрите на таблицу Excell и всё станет понятно. Если столбец «А» заполнить значениями, то получится одномерный массив. Как он расположен? Правильно… горизонтально, потому, что я смотрю на это лёжа на диване………

Спасибо за ответ. Понял все что Вы написали. Но не понял смысла написанного с точки зрения моей проблемы.

Под горизонтальным двумерным массивом в моем коде  я имею в виду когда есть 2 строки под индексом 0 или 1 и столбцы под индексами от 0 до 30. Первое измерение обозначается как  [0] [0], [0] [1], [0] [2], ...[0] [30] Второе измерение обозначается как  [1] [0], [1] [1], [1] [2], ...[1] [30] 

Под вертикальным  двумерным массивом в моем коде  я имею в виду когда есть 31 строка под индексами от  0 до 30 и  2 столбца под индексами  0 и 1. Первое измерение обозначается как  [0] [0], [1 [0], [2] [0], ...[30] [0] Второе измерение обозначается как  [0] [1], [1] [1], [2] [1], ...[30] [1] 

Если исполнить мой код то массив заполнится по вертикали. И функция  ArraySort() будет сортировать массив как ей и положено.

ВОПРОС Почему при этом функция  ArrayFill() работать не будет? Ведь я попросил ее что бы она на двадцатой минуте заполнила первое измерение массива (31 элемент) одинаковыми значениями 0.5555.
Спасибо за помощь.

 
MakarFX:

Я бы так попробывал

Спасибо за помощь. Попробую. 

 
Aleksei Stepanenko:

выражение

тождественно этому:

 А если Вы хотите что-то сохранить, то сделайте это в глобальной переменной.

Эта та, которая объявляется вне тела функции.

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

Можно ли использовать статистическую переменную -  static?  Будет ли программа в таком виде рабочей?

    double LB=0,LS=0;
    int b=0,s=0;
    static int izmb, izms; // статическая переменная
   
   for (int i=0; i<OrdersTotal(); i++)
   {    
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      { 
         if (OrderSymbol()==Symbol())
         { 
            int tip = OrderType(); 
            if (tip==OP_BUY)             
            {  
               LB  += OrderLots();
               b++; 
            }                                         
            if (tip==OP_SELL)        
            {
               LS  += OrderLots();
               s++;
            } 
         }
     }
     
   }
    if (izmb!=b || izms!=s){ 
    izmb=b;
    izms=s 
           // далее идут условия для открытия ордера.
     }
Причина обращения: