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

 
trader781:

Тогда ответь пожалуйста на мой предыдущий вопрос

1) Запись массива структур

2) передача по другим функциям

3) извлечение и сравнение между собой элементов массива структур 

4) принт массива структур 

мне важна сама запись в виде кода чтоб я понимал как это должно выглядеть

Всё зависит от поставленной задачи. Так как задачи могут быть сколь угодно разными, то что именно показывать?

Ну напишу, потрачу время, а что написал - оно квадратное. А отверстие - треугольное. И куда квадратное запихнуть тогда?

 
Artyom Trishkin:

Всё зависит от поставленной задачи. Так как задачи могут быть сколь угодно разными, то что именно показывать?

Ну напишу, потрачу время, а что написал - оно квадратное. А отверстие - треугольное. И куда квадратное запихнуть тогда?

возьмем пост 699 и около него

как это передавать в другие функции и сравнивать элемент структуры с предыдущим  элементом

и  чтоб я мог взять какойто ордер по порядку и вывести все значения в принт

разница в том что там не число и действуют другие правила записи.

 
trader781:

возьмем пост 699 и около него

как это передавать в другие функции и сравнивать элемент структуры с предыдущим  элементом

и  чтоб я мог взять какойто ордер по порядку и вывести все значения в принт

разница в том что там не число и действуют другие правила записи.

Вам нужно в цикле пройтись по всем нужным вам ордерам.

После определения очередного нужного ордера, увеличиваете массив на 1, и записываете в новую его ячейку все данные по этому ордеру. В саму же ячейку массива записываете время открытия ордера (если ищете закрытые, то время закрытия). Остальные данные вписываете в поля структуры

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

Вот сделайте сначала это. Далее остальное можно обсуждать.

 
Vitalie Postolache:

В пределах одного цикла такая задача не решается.

Спасибо.

 
Artyom Trishkin:
//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
struct myorder
  {
   int               Ticket;
   double            orderopenprice;
   int               ordertype;
   double            profit;
   double            stoploss;
   double            lot;
  };
myorder orders[][5];

int    i;
int    Magic=444;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   CalcOrders();

  }
//+------------------------------------------------------------------+
void CalcOrders()
  {
   int count1=-1;
   ArrayResize(orders,AccountInfoInteger(ACCOUNT_LIMIT_ORDERS),10);
   for(i=OrdersTotal()-1; i>=0; i--)
     {
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol())
         && (OrderMagicNumber()==Magic) && (OrderType()<2))
        {
         count1++;
         orders[count1][0].Ticket=OrderTicket();
         orders[count1][1].lot=OrderLots();
         orders[count1][2].orderopenprice=OrderOpenPrice();
         orders[count1][3].ordertype=OrderType();
         orders[count1][4].profit=OrderProfit();
         orders[count1][5].stoploss=OrderStopLoss();
        }

     }
   ArraySort(orders,WHOLE_ARRAY,0,MODE_ASCEND);

  }
//+------------------------------------------------------------------+
Файлы:
test.mq4  3 kb
 
trader781:

Я разместил ваш код в ваше сообщение.

А теперь если начать разбираться, то

  1. Для чего сделали массив структур многомерным массивом?
  2. Для чего в функции CalcOrders() изменяете размер массива структур до "Максимально допустимое количество действующих отложенных ордеров" ? Если откроете справку (что всегда должны делать), то увидите, что этот идентификатор (ACCOUNT_LIMIT_ORDERS) может возвращать и ноль, что соответствует отсутствию ограничения на количество отложенных ордеров. Размер массива должен быть перед циклом нулевым.
  3. Почему не увеличиваете размер массива в цикле?
 
Artyom Trishkin:

Я разместил ваш код в ваше сообщение.

А теперь если начать разбираться, то

  1. Для чего сделали массив структур многомерным массивом?
  2. Для чего в функции CalcOrders() изменяете размер массива структур до "Максимально допустимое количество действующих отложенных ордеров" ? Если откроете справку (что всегда должны делать), то увидите, что этот идентификатор (ACCOUNT_LIMIT_ORDERS) может возвращать и ноль, что соответствует отсутствию ограничения на количество отложенных ордеров. Размер массива должен быть перед циклом нулевым.
  3. Почему не увеличиваете размер массива в цикле?

1) посчитал что Х ордер У номер параметра более соответствует данной задаче

2) у меня он равен 50 или 100 в зависимости от типа счета, и никак иначе

3)  так если  count1++; будет при каждом проходе увеличиваться а массив приобретать его значение

 
trader781:

1) посчитал что Х ордер У номер параметра более соответствует данной задаче

2) у меня он равен 50 или 100 в зависимости от типа счета, и никак иначе

3)  так если  count1++; будет при каждом проходе увеличиваться а массив приобретать его значение

1. А для чего тогда структура?

2. Вам этот параметр для массива рыночных позиций "что шёл, что ехал"... Массив перед циклом должен иметь нулевой размер.

3. Всё правильно. Сначала массив имеет нулевой размер. С каждым новым найденным ордером массив становится равным по размеру количеству нужных вам ордеров.

 
Artyom Trishkin:

1. А для чего тогда структура?

2. Вам этот параметр для массива рыночных позиций "что шёл, что ехал"... Массив перед циклом должен иметь нулевой размер.

3. Всё правильно. Сначала массив имеет нулевой размер. С каждым новым найденным ордером массив становится равным по размеру количеству нужных вам ордеров.

1) компилятор ругается если второе измерение не поставить, сразу выскочит "укажите тип класса, неизвестные параметры"

2) тогда бот сдохнет сразу же при запуске с "critical error array out of range

3)  сразу задаем int count1=-1; Далее проходим по циклу. Что тут не так?

 
trader781:

1) компилятор ругается если второе измерение не поставить

2) тогда бот сдохнет сразу же при запуске с "critical error array out of range" 

3)  сразу задаем int count1=-1;  Что тут не так?

1. Он как раз вам говорит, что одно из измерений нужно убрать. Вы объявляете одномерный массив, а записывать хотите в двумерный. Что в итоге? Конечно ошибку получите от компилятора.

2. Чтобы не сдох, нужно правильно заполнить массив в цикле, а не задать ему не0пойми-какой-размер, а потом туда пихать не-пойми-сколько-чего.

3. Это вы переменную задаёте равной -1. А массив должен иметь перед циклом нулевой размер. Что тут не понятно?

Давайте поиграем в ассоциации:

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

    А теперь представьте себе, что вы изначально складываете монетки не в шарик, который резиновый и может менять свой размер, а в маленькую копилку, имеющую ограниченный объём (вы изначально задали размер массива, и больше его не увеличивали). Что будет? Не все монетки в копилку поместятся. А в шарик - все.

Такая вот вам ассоциация.
Причина обращения: