Помогите научиться программировать.

 

Как собирать информацию о сделках и пользоваться ей? Мне нужно собрать информацию о всех позициях советника, их объеме, прибыли, типе, цене открытия. А потом обратиться к информации о самой свежей позиции, или самой большой позиции. У меня вызывает затруднение запись в массивы.

1. Нужно ли вообще связываться с массивами?

2. Лучше использовать массив структур или разные массивы?

3. Зачем нужен динамический массив, если всё равно нужно выделять память с запасом? Не проще ли использовать статический массив? Или без динамического не обойтись, потому что он может быть с обратной индексацией?


Пример кода без ооп, потому что я что-то не смог даже написать эту конструкцию, если не затруднит, спасибо.

 
pribludilsa:

Как собирать информацию о сделках и пользоваться ей? Мне нужно собрать информацию о всех позициях советника, их объеме, прибыли, типе, цене открытия. А потом обратиться к информации о самой свежей позиции, или самой большой позиции. У меня вызывает затруднение запись в массивы.

1. Нужно ли вообще связываться с массивами?

2. Лучше использовать массив структур или разные массивы?

3. Зачем нужен динамический массив, если всё равно нужно выделять память с запасом? Не проще ли использовать статический массив? Или без динамического не обойтись, потому что он может быть с обратной индексацией?


Пример кода без ооп, потому что я что-то не смог даже написать эту конструкцию, если не затруднит, спасибо.

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

 

1. При работе с историей торговли обычно обходятся без массивов. Примерно так, как в примере: https://www.mql5.com/ru/docs/trading/historyselect. Стоит изучить все функции в колонке слева по ссылке (и все примеры, которые там есть).

2. Массив структур - это очень удобно. Вот только с ним не работают встроенные функции, которые можно применять к многомерным массивам - ArraySort() и пр.

3. Если уверены, что изначально указанного размера массива хватит, то можно и статические применять. Если их размер разумен.

 
Vladimir Karputov:

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

Я пытаюсь писать сетку без ооп. Ну так для начала решил потренироваться, и что-то не могу сконструировать запись в массив. А может она не нужна? Как оптимальнее сделать? Ну я в цикле и думал. Вот так начал.
int OnInit()
{
ENUM_POSITIONS_TYPE ar [1000]; //проинициализирую нулем еще, просто я не копирую, а вручную всё пишу, и некоторые очевидные куски не пишу.
 return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{}
void OnTick()
{
for(int index=PositionsTotal()-1; index>=0; index--)
{
ulong ticket=PositionGetTicket(index);
PositionSelectByTicket(ticket); // И вот я готов вызывать функции для выуживания данных, только я не знаю //как их вписывать в массив. 
 
Dmitry Fedoseev:

1. При работе с историей торговли обычно обходятся без массивов. Примерно так, как в примере: https://www.mql5.com/ru/docs/trading/historyselect. Стоит изучить все функции в колонке слева по ссылке (и все примеры, которые там есть).

2. Массив структур - это очень удобно. Вот только с ним не работают встроенные функции, которые можно применять к многомерным массивам - ArraySort() и пр.

3. Если уверены, что изначально указанного размера массива хватит, то можно и статические применять. Если их размер разумен.

Это я не с историей, это позиции хочу проанализировать открытые. Как лучше сделать?
 
Вот пишу сетку без ооп. Мне надо узнать, какая из открытых позиций самая большая, и она по какому типу сделок идет , бай или сел. Я так понимаю, что надо в цикле сначала собрать из каждой позиции данные , записать в массив, потом анализировать массив, либо брать самый свежий элемент, если это динамический с обратной индексацией.
 
pribludilsa:
Это я не с историей, это позиции хочу проанализировать открытые. Как лучше сделать?

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

 
pribludilsa:
Вот пишу сетку без ооп. Мне надо узнать, какая из открытых позиций самая большая, и она по какому типу сделок идет , бай или сел. Я так понимаю, что надо в цикле сначала собрать из каждой позиции данные , записать в массив, потом анализировать массив, либо брать самый свежий элемент, если это динамический с обратной индексацией.

Не надо в массив- перебирать позиции, и по ходу дела выискивать максимум и минимум.

 
Dmitry Fedoseev:

Не надо в массив- перебирать позиции, и по ходу дела выискивать максимум и минимум.


Спасибо. Только можете пример коротенький? Нам же нужно записать, чтобы сравнить? А записать куда кроме как не в массив? Я не соображу как без записи сделать. Работа то идёт с одной позицией в проходе цикла, как мы можем сравнить другую позицию, если она в другом проходе цикла?

 
pribludilsa:

Спасибо. Только можете пример коротенький? Нам же нужно записать, чтобы сравнить? А записать куда кроме как не в массив? Я не соображу как без записи сделать. Работа то идёт с одной позицией в проходе цикла, как мы можем сравнить другую позицию, если она в другом проходе цикла?

int Magic=123;

double maxBuyPrice=0;
ulong maxBuyTicket=0;
double minSellPrice=DBL_MAX;
ulong minSellTicket=0;   

for(int i=0;i<PositionsTotal();i++){
   ulong ticket=PositionGetTicket(i);
   if(ticket!=0){
      long magic=PositionGetInteger(POSITION_MAGIC);
      string symbol=PositionGetString(POSITION_SYMBOL);
      if(magic==Magic && symbol==Symbol()){
         long type=PositionGetInteger(POSITION_TYPE);
         if(type==POSITION_TYPE_BUY){
            if(PositionGetDouble(POSITION_PRICE_OPEN)>maxBuyPrice){
               maxBuyPrice=PositionGetDouble(POSITION_PRICE_OPEN);
               maxBuyTicket=ticket; // тут можно и другие данные позиции запоминать в переменные
            }
         }
         else if(type==POSITION_TYPE_SELL){
            if(PositionGetDouble(POSITION_PRICE_OPEN)<minSellPrice){
               minSellPrice=PositionGetDouble(POSITION_PRICE_OPEN);
               minSellTicket=ticket; // и тут
            }      
         }
      }
   }
}

if(maxBuyTicket!=0){
   
}
if(minSellTicket!=0){

}
 
Dmitry Fedoseev:

Спасибо за такой пример.

      long magic=PositionGetInteger(POSITION_MAGIC);
      string symbol=PositionGetString(POSITION_SYMBOL);
      if(magic==Magic && symbol==Symbol())

Я думал, что я один предпочитаю так раскладывать всё, а не писать хз как

      if(PositionGetInteger(POSITION_MAGIC)==Magic && PositionGetString(POSITION_SYMBOL)==Symbol())

хз — в переводе на русский «хотелось-бы знать»… не подумайте плохого…


ps; Это помогает проследить всё что можно во время отладки программы.