Скачать MetaTrader 5

Выбор позиции из нескольких

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нет времени изучать MQL5? Библиотека исходников для вас!
_Dude_
24
_Dude_ 2010.07.09 16:52 

Открыты 3 позиции по одному инструменту. Нужно их последовательно проверить на предмет соответствия условиям. PositionSelect выбирает только последнюю позицию. В MQL4 выходил из положения так

for(int b=0;b<OrdersTotal();b++)
   {
   OrderSelect(b,SELECT_BY_POS,MODE_TRADES); и т.п.

 Подскажите, плиз как эт реализовать в MQL5.

Rashid Umarov
Админ
11826
Rashid Umarov 2010.07.09 17:15  
По каждому инструменту может быть только одна открытая позиция.

Vladimir Batrudinov
4926
Vladimir Batrudinov 2010.07.09 17:30  
Rosh:
По каждому инструменту может быть только одна открытая позиция.

Если речь о позициях

Речь наверно идет о простом переборе всех позиций. Тут проблема в том что PositionsTotal() возврашшает число позиций в int, а  PositionSelect выбирает позу по символу.

А как проще перебрать все позиции по номер вопрос?

Для решения подобной проблемы нужна еще одна реализация PositionSelect (с выбором не по символу, а по номеру) -

bool  PositionSelect(
uint    id,         // нермер позиции
uint    timeout=0   // таймаут в миллисекундах
);

Если речь об ордерах

Так тут вообще все просто, для OrderSelect() выбор ордера происходит по тикету

bool  OrderSelect(
ulong   ticket,      // тикет ордера
uint    timeout=0    // таймаут в миллисекундах
); 
Vladimir Batrudinov
4926
Vladimir Batrudinov 2010.07.09 21:09  
Ну вот нашлось решение и для позиций - PositionGetSymbol.
string  PositionGetSymbol(int  index);

Теперь использую совместно с PositionsTotal и PositionSelect мы очень просто переберем все позиции в цикле...

Maryan Kozovyy
657
Maryan Kozovyy 2012.07.30 23:59  

такая конструкция?

void OnTick(){

         int cnt=PositionsTotal(); for (int i=cnt-1; i>=0; i--){

         string sy=(string)PositionGetSymbol(POSITION_SYMBOL);

         Print(sy);}}

 

Alexander Laur
7692
Alexander Laur 2012.07.31 00:19  
maryan.dirtyn:

такая конструкция?

 

 Не совсем понял вопрос.

Если у Вас есть позиции по разным инструментам и Вы хотите их перебрать, то делается это так:

//объявляем глобальные переменные
string sy[12];   //массив где хранятся названия инструментов

int OnInit(){

//---Инициализациия рабочих инструментов
   sy[0]   = "EURUSD";
   sy[1]   = "GBPUSD";
   sy[2]   = "AUDUSD";
   sy[3]   = "USDCHF";
   sy[4]   = "USDCAD";
   sy[5]   = "USDJPY";
   sy[6]   = "EURGBP";
   sy[7]   = "EURAUD";
   sy[8]   = "EURCHF";
   sy[9]   = "EURJPY";
   sy[10]  = "GBPJPY";
   sy[11]  = "GBPCHF";
   return(0);
}

void OnTick(){
   for( int i = 0; i < 12; i++ ){
      if ( PositionSelect( sy[i] ) ){ //если позиция по данному символу существует, печатаем название инструмента
         Print( " sy = ",sy[i] );
      }
   }
   return;
}

 

Maryan Kozovyy
657
Maryan Kozovyy 2012.07.31 00:31  
papaklass:

 Не совсем понял вопрос.

Если у Вас есть позиции по разным инструментам и Вы хотите их перебрать, то делается это так:

есть позиции по разным инструментам. а возможности без явной инициализации нету?
Alexander Laur
7692
Alexander Laur 2012.07.31 02:39  
maryan.dirtyn:
есть позиции по разным инструментам. а возможности без явной инициализации нету?

 Инициализация происходит один раз в функции OnInit(). А перебор по инструментам (цикл for(){}) Вы осуществляете в функции OnTick(). Можете это делать хоть на каждом тике. В представленном Вами коде в теле цикла отсутствует переменная цикла, поэтому перебора не происходит. Я Вам показал как делать перебор по инструментам.

Как Вы открываете позиции по разным инструментам не проициализировав последние? 

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
220Volt
1175
220Volt 2012.07.31 05:52  
maryan.dirtyn:
есть позиции по разным инструментам. а возможности без явной инициализации нету?

Есть такая возможность, у Вас было правильное направление мыслей в примере, но с реализацией не совсем согласен. Я вот так для проверки написал:

for(int pos = PositionsTotal() - 1;  pos >= 0;  pos --)
{
   string positionSymbol = PositionGetSymbol(pos);  
   Alert(positionSymbol);
   // Добавляем действия над открытой позицией.
}
Roman Zamozhnyy
2187
Roman Zamozhnyy 2012.07.31 08:20  

Можно ещё и вот так:
int symbols_total=SymbolsTotal(true);
int market_watch_symbol;
market_watch_symbol=0;
while(market_watch_symbol<symbols_total)
{
 symbol=SymbolName(market_watch_symbol,true);
 ...
 market_watch_symbol++;
}

 Вместо "..." работаем с позицией по символу, если она есть.

 

 

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