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

 
Alexey Viktorov:
Например здесь https://docs.mql4.com/ru/basis/preprosessor/compilation
Спасибо!
 
trader781:

в текущем примере я хочу иметь возможность положить туда бесконечное количество ордеров с любыми лотами чтобы не было выхода за его пределы

конечно границы мы знаем и все в курсе, но хочу именно так 

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

 

вот у меня получилась вот такая хрень. Ожидалось вид орде по по порядку... лот? чтоб в ордерсенд  вместо лота я добавил результат (лот такого-то ордера*коэффициент)

и вопрос извлечения данных оттуда 

хочу получить так как я себе представляю

MyArray[0][0.01]

MyArray[1][0.01]

MyArray[2][0.02]

и т д... 

Ну так а в чём собственно вопрос?

Вы записали массив с лотами, потом его отсортировать по размеру лота, это и будет сортировка по номерам открытия, потому как в вашем случае каждая следующая позиция открывается с бОльшим лотом

double BPosMass[];
double SPosMass[];

void OnTick()
{
// Заполняем массивы
int b=-1,s=-1; // Объявим переменные с минусом
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if(OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic || Magic<0)) {
     if(OrderType()==OP_BUY) {
      b++;
       ArrayResize(BPosMass,b+1);
       BPosMass[b]= OrderLot();
     }
     if(OrderType()==OP_SELL) {
      s++;
       ArrayResize(SPosMass,s+1);
       SPosMass[s]= OrderLot();
     }
  }}} // конец записи массив

// Читаем отсортированный массив с лотами
// Buy
  if(b>0) { // Если он не пустой и больше двух элементов - [0], иначе будет ошибка: "Выход за пределы массива"
    ArraySort(BPosMass, WHOLE_ARRAY, 0, MODE_ASCEND); // Отсортируем по размеру лота
    // Работа с полученными данными
    Comment("Самый старый Buy лот: ",    BPosMass[0],
            "\nПоследний Buy лот: ",     BPosMass[b],
            "\nПредпоследний Buy лот: ", BPosMass[b-1]
           );

  } // end Buy

// Sell
  if(s>0) { // Если он не пустой и больше двух элементов - [0], иначе будет ошибка: "Выход за пределы массива"
    ArraySort(SPosMass, WHOLE_ARRAY, 0, MODE_ASCEND); // Отсортируем по размеру лота
    // Работа с полученными данными
    Comment("Самый старый Sell лот: ",    SPosMass[0],
            "\nПоследний Sell лот: ",     SPosMass[s],
            "\nПредпоследний Sell лот: ", SPosMass[s-1]
           );

  } // end Sell
  
// Конец функции OnTick()
}


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

Выход за пределы массива происходит не в момент записи, а в момент чтения.

 
Vitaly Muzichenko:


Выход за пределы массива происходит не в момент записи, а в момент чтения.

Неа. В момент обращения к несуществующему индексу массива.
 
Vitalie Postolache:
Неа. В момент обращения к несуществующему индексу массива.
Ну так а Я что написал?
 
Vitaly Muzichenko:
Ну так а Я что написал?

2017.01.13 12:51:14.372 2017.01.05 16:30:00  martin GBPUSD,M5: MyArray[CountOrders][0]0.02
2017.01.13 12:51:14.372 2017.01.05 16:25:00  martin GBPUSD,M5: MyArray[CountOrders][0]0.01

 

CountOrders постоянное а лот меняется. Так быть не должно, а по другому не выходит

в идеале  запись MyArray[CountOrders][OrderLots()]

чтобы выдало результат MyArray[0][0.01]     MyArray[1][0.01]

но в мкл такое не прокатывает 

ну и потом это как то извлекать из функции в поток
 
trader781:

2017.01.13 12:51:14.372 2017.01.05 16:30:00  martin GBPUSD,M5: MyArray[CountOrders][0]0.02
2017.01.13 12:51:14.372 2017.01.05 16:25:00  martin GBPUSD,M5: MyArray[CountOrders][0]0.01

 

CountOrders постоянное а лот меняется. Так быть не должно, а по другому не выходит

в идеале  запись MyArray[CountOrders][OrderLots()]

чтобы выдало результат MyArray[0][0.01]     MyArray[1][0.01]

но в мкл такое не прокатывает 

Структуры вам помогут. Создаёте структуру с нужными полями, объявляете массив таких структур, заполняете его данными ордеров в цикле по времени открытия, а далее уже ищете в нём всё, что душе угодно. Проверяете поля структуры по индексу и сравниваете с нужным вам значением. Индекс как раз будет указывать на порядковый номер ордера по его времени открытия, а в полях структуры будут все нужные вам данные по этому конкретному ордеру.
 
Artyom Trishkin:
Структуры вам помогут. Создаёте структуру с нужными полями, объявляете массив таких структур, заполняете его данными ордеров в цикле по времени открытия, а далее уже ищете в нём всё, что душе угодно. Проверяете поля структуры по индексу и сравниваете с нужным вам значением. Индекс как раз будет указывать на порядковый номер ордера по его времени открытия, а в полях структуры будут все нужные вам данные по этому конкретному ордеру.

У нас получилась вооот такая хреновина

struct myorder
{
int    Ticket;
double orderopenprice;
int   ordertype;
double profit;
double stoploss;
double  lot;
};

myorder orders[];

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


 я хочу вытащить к примеру лот 5 ордера и сравнить его со лотом третьего

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

нужна сама запись в виде команд для подобного

 
trader781:

У нас получилась вооот такая хреновина

struct myorder
{
int    Ticket;
double orderopenprice;
int   ordertype;
double profit;
double stoploss;
double  lot;
};

myorder orders[];

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


 я хочу вытащить к примеру лот 5 ордера и сравнить его со лотом третьего

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

нужна сама запись в виде команд для подобного

Так как индекс цикла i ссылается на любые ордера, а не только на нужные вам, то нужно в функции объявить переменную (например n=0;), которая будет отвечать за размер массива. Внутри цикла после прохождения проверок увеличить значение этой переменной, увеличить размер массива на величину этой переменной, и уже по индексу n-1 заполнять поля структуры: orders[n-1].xxx=XXX;

 

Скажите, почему при переборе ордеров функцией OrdersTotal() пишут -1.

Пример: for (i=OrdersTotal()-1 ;i>=0; i--)

почему не просто  OrdersTotal() ?

Счет ордеров в этой функции начинается с 0 или с 1? То есть если есть один ордер,  OrdersTotal() равен 0 или 1?

 
Artyom Trishkin:

Так как индекс цикла i ссылается на любые ордера, а не только на нужные вам, то нужно в функции объявить переменную (например n=0;), которая будет отвечать за размер массива. Внутри цикла после прохождения проверок увеличить значение этой переменной, увеличить размер массива на величину этой переменной, и уже по индексу n-1 заполнять поля структуры: orders[n-1].xxx=XXX;

так как у нас есть пачка ордеров почему нельзя взять и сразу вытащить нужный? (нужные)  и сделать с ними то что хочется? например ордер (i-4)
Причина обращения: