Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1578

 
Valeriy Yastremskiy #:
Явно в строке присвоить значения элементам массива. Потом умножать в цикле если нужно менять лот. Самое дешёвое, но длинное. Если это один раз делать, то без разницы наверное.)

Это нужно писать каждый элемент?

Как-то-бы циклами это делать. Да, это единоразово в OnInit()

 
Vitaly Muzichenko #:

Вопрос: как красиво заполнить массив до 100 элементов?

Поскольку индексы, на которых происходит изменение значения элемента не имеют простой зависимости (типа каждый следующий на 7 больше предыдущего), то их надо иметь в коде. Множитель, на который умножается R, представляет собой арифметическую прогрессию с шагом 1. Поэтому можно реализовать тот код примерно так:

double R = 0.01;
double Mas[100];
double bounds[] = {18, 27, 35, 42, 48, 55, 60, 64, 67, 69, 71, 100};

for(int i = 0, b = 0, f = 1; i < ArraySize(Mas); i++) {
   if(i == bounds[b]) {
      f++;
      b++;
   }
   Mas[i] = R * f;
}

ArrayPrint(Mas);

Обратите внимание, что для i < 10 и i < 18 множитель не меняется, поэтому число 10 не вошло в массив границ индексов bounds.

Если множители могут меняться по разному, то их тоже можно организовать в виде массива:

double R = 0.01;
double Mas[100];
double bounds[]  = {10, 18, 27, 35, 42, 48, 55, 60, 64, 67, 69, 71, 100};
double factors[] = { 1,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11,  12};

for(int i = 0, b = 0; i < ArraySize(Mas); i++) {
   if(i == bounds[b]) b++;
   Mas[i] = R * factors[b];
}

ArrayPrint(Mas);

И ещё такой момент. Строка инициализации массива такого вида:

double Mas[100] = {0};

гарантировано инициализирует нулём только первый элемент массива. Попробуйте выполнить такой код:

double R = 0.01;
double Mas[10] = {R};

ArrayPrint(Mas);

и вы увидите в выводе:

(EURUSD,H1) |   0.01000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000

Для полной инициализации надо либо перечислять в скобках все 100 значений для массива из 100 элементов, либо использовать функцию ArrayInitialize(), например.

Но в вашей задаче инициализация массива не требуется, так как вы не модифицируете имеющиеся начальные значения, а каждый раз присваиваете новые.

 
Vitaly Muzichenko #:

Вопрос: как красиво заполнить массив до 100 элементов?

Скажите, а зачем тут оператор += ? Ведь в массиве ноль… Следовательно тут достаточно простого оператора присваивания =

 
Alexey Viktorov #:

Скажите, а зачем тут оператор += ? Ведь в массиве ноль… Следовательно тут достаточно простого оператора присваивания =

набирал на сайте, а потом не смог редактировать. Ночью спать нужно, а не кодами страдать :) 

 
Yuriy Bykov #:

Поскольку индексы, на которых происходит изменение значения элемента не имеют простой зависимости (типа каждый следующий на 7 больше предыдущего), то их надо иметь в коде. Множитель, на который умножается R, представляет собой арифметическую прогрессию с шагом 1. Поэтому можно реализовать тот код примерно так:

Обратите внимание, что для i < 10 и i < 18 множитель не меняется, поэтому число 10 не вошло в массив границ индексов bounds.

Если множители могут меняться по разному, то их тоже можно организовать в виде массива:

И ещё такой момент. Строка инициализации массива такого вида:

гарантировано инициализирует нулём только первый элемент массива. Попробуйте выполнить такой код:

и вы увидите в выводе:

Для полной инициализации надо либо перечислять в скобках все 100 значений для массива из 100 элементов, либо использовать функцию ArrayInitialize(), например.

Но в вашей задаче инициализация массива не требуется, так как вы не модифицируете имеющиеся начальные значения, а каждый раз присваиваете новые.

Спасибо!

Возьму второй вариант.

 
Vitaly Muzichenko #:

Вопрос: как красиво заполнить массив до 100 элементов?

Ещё один цикл с 7 добавь и проверку .для R пропиши индексацию.даже и без этого код   отвратный просто 
 
Рaра Нoth #:
Ещё один цикл с 7 добавь и проверку .для R пропиши индексацию.даже и без этого код   отвратный просто 

Я ничего не понял.

 
Vitaly Muzichenko #:

Я ничего не понял.

Посмотри как матрицу рисуют двумя циклами, только задавай значения по отдельному индексу в одном цикле
 

Всем доброго дня и хорошего настроения!

В статье есть код функции проверка достаточности средств на совершение торговой операции:

bool CheckMoneyForTrade(string symb,double lots,ENUM_ORDER_TYPE type)
  {
//--- получим цену открытия
   MqlTick mqltick;
   SymbolInfoTick(symb,mqltick);
   double price=mqltick.ask;
   if(type==ORDER_TYPE_SELL)
      price=mqltick.bid;
//--- значения необходимой и свободной маржи
   double margin,free_margin=AccountInfoDouble(ACCOUNT_MARGIN_FREE);
   //--- вызовем функцию проверки
   if(!OrderCalcMargin(type,symb,lots,price,margin))
     {
      //--- что-то пошло не так, сообщим и вернем false
      Print("Error in ",__FUNCTION__," code=",GetLastError());
      return(false);
     }
   //--- если не хватает средств на проведение операции
   if(margin>free_margin)
     {
      //--- сообщим об ошибке и вернем false
      Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError());
      return(false);
     }
//--- проверка прошла успешно
   return(true);
  }

Желтым выделено то, что сначала объявили переменную price и присвоили ей значение цены Ask, а буквально через строчку, где проверяется тип ордера, соответственно присваивается значение Bid.

Вопрос - а почему нельзя сразу присвоить Bid на стадии объявления переменной  price или тут есть какой-то сакральный смысл?

С уважением, Владимир.

 
MrBrooklin #:

Всем доброго дня и хорошего настроения!

В статье есть код функции проверка достаточности средств на совершение торговой операции:

Желтым выделено то, что сначала объявили переменную price и присвоили ей значение цены Ask, а буквально через строчку, где проверяется тип ордера, соответственно присваивается значение Bid.

Вопрос - а почему нельзя сразу присвоить Bid на стадии объявления переменной  price или тут есть какой-то сакральный смысл?

С уважением, Владимир.

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

Когда получил размер маржи, ты должен произвести арифметические операции… А тут ы структуре всё уже посчитано.

struct MqlTradeCheckResult 
  { 
   uint         retcode;             // Код ответа 
   double       balance;             // Баланс после совершения сделки 
   double       equity;              // Эквити после совершения сделки 
   double       profit;              // Плавающая прибыль 
   double       margin;              // Маржевые требования 
   double       margin_free;         // Свободная маржа 
   double       margin_level;        // Уровень маржи 
   string       comment;             // Комментарий к коду ответа (описание ошибки) 
  };