" В системе хеджирования позиция не может быть отменена. В этом случае текущая позиция закрывается и открывается новая с оставшимся объемом. "
Есть ли способ отключить это, чтобы я мог одновременно держать открытые позиции на покупку и продажу по валютной паре?
Я думаю, вам нужно задать свой вопрос на форуме - здесь тема для тех, кто задает вопросы о ПРОГРАММИРОВАНИИ на MQL5, а у вас, как правило, нулевые знания. Вы умудряетесь неправильно трактовать документацию. Пожалуйста, не пишите больше в этой теме - эта тема для тех, кто программирует.
Пример - есть линия(горизонтальная линия или линия тренда), и вам нужно отследить, когда цена пересекает эту линию.
Для этого сначала нужно получить цену линии - но прежде всего мы проверяем, существует ли вообще объект с таким названием? Если такой объект есть, то, в зависимости от типа объекта, мы получаем цену:
//+------------------------------------------------------------------+//| Structure Calculate Positions |//+------------------------------------------------------------------+struct STRUCT_CALCULATE_POSITIONS
{
string symbol; // position symbolint count_buys; // count position BUYint count_sells; // count position SELL//--- Constructor
STRUCT_CALCULATE_POSITIONS()
{
symbol = "";
count_buys = 0;
count_sells = 0;
}
};
создается и эта структура заполняется в функции'CalculateAllPositions'
//+------------------------------------------------------------------+//| Calculate all positions Buy and Sell |//+------------------------------------------------------------------+void CalculateAllPositions(STRUCT_CALCULATE_POSITIONS &SCalculatePositions[])
{
ArrayFree(SCalculatePositions);
for(int i=PositionsTotal()-1; i>=0; i--)
if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
{
string pos_symbol=m_position.Symbol();
int size=ArraySize(SCalculatePositions);
int find=false;
for(int j=0; j<size; j++)
{
if(SCalculatePositions[j].symbol==pos_symbol)
{
if(m_position.PositionType()==POSITION_TYPE_BUY)
SCalculatePositions[j].count_buys=SCalculatePositions[j].count_buys+1;
if(m_position.PositionType()==POSITION_TYPE_SELL)
SCalculatePositions[j].count_sells=SCalculatePositions[j].count_sells+1;
find=true;
break;
}
}
if(!find)
{
ArrayResize(SCalculatePositions,size+1);
SCalculatePositions[size].symbol=pos_symbol;
if(m_position.PositionType()==POSITION_TYPE_BUY)
SCalculatePositions[size].count_buys=SCalculatePositions[size].count_buys+1;
if(m_position.PositionType()==POSITION_TYPE_SELL)
SCalculatePositions[size].count_sells=SCalculatePositions[size].count_sells+1;
}
}
//---return;
}
функции.
Например, был создан тестовый советник: сначала он открывает четыре позиции, а затем (после вызова функции 'CalculateAllPositions') распаковывает структуру 'STRUCT_CALCULATE_POSITIONS'.
Еще один пример использования структуры'STRUCT_CALCULATE_POSITIONS'. Советник открывает позицию на новом баре. Стоп-лосс или тейк-профит отсутствуют. Открытые позиции никто не закрывает - это демонстрация того, как использовать и как работать со структурой'STRUCT_CALCULATE_POSITIONS'.
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
STRUCT_CALCULATE_POSITIONS SCPos[];
CalculateAllPositions(SCPos);
int size=ArraySize(SCPos);
//--- Symbol 0if(m_symbol_0)
{
datetime time_0=iTime(InpSymbol_0,Period(),0);
if(time_0!=m_prev_bars_0)
{
m_prev_bars_0=time_0;
//--- search for trading signals only at the time of the birth of new barint count_buys=0,count_sells=0;
for(int i=0; i<size; i++)
{
if(SCPos[i].symbol==InpSymbol_0)
{
count_buys=SCPos[i].count_buys;
count_sells=SCPos[i].count_sells;
break;
}
}
if(count_buys+count_sells<InpMaxPositions)
{
double lot=SymbolInfoDouble(InpSymbol_0,SYMBOL_VOLUME_MIN);
if(lot>0.0)
{
MqlRates rates[];
ArraySetAsSeries(rates,true);
int start_pos=0,count=3;
if(CopyRates(InpSymbol_0,Period(),start_pos,count,rates)==count)
{
if(rates[1].open<rates[1].close)
m_trade.Buy(lot,InpSymbol_0);
else
m_trade.Sell(lot,InpSymbol_0);
}
}
}
}
}
//--- Symbol 1if(m_symbol_1)
{
datetime time_0=iTime(InpSymbol_1,Period(),0);
if(time_0!=m_prev_bars_1)
{
m_prev_bars_1=time_0;
//--- search for trading signals only at the time of the birth of new barint count_buys=0,count_sells=0;
for(int i=0; i<size; i++)
{
if(SCPos[i].symbol==InpSymbol_1)
{
count_buys=SCPos[i].count_buys;
count_sells=SCPos[i].count_sells;
break;
}
}
if(count_buys+count_sells<InpMaxPositions)
{
double lot=SymbolInfoDouble(InpSymbol_1,SYMBOL_VOLUME_MIN);
if(lot>0.0)
{
MqlRates rates[];
ArraySetAsSeries(rates,true);
int start_pos=0,count=3;
if(CopyRates(InpSymbol_1,Period(),start_pos,count,rates)==count)
{
if(rates[1].open<rates[1].close)
m_trade.Buy(lot,InpSymbol_1);
else
m_trade.Sell(lot,InpSymbol_1);
}
}
}
}
}
//--- Symbol 2if(m_symbol_2)
{
datetime time_0=iTime(InpSymbol_2,Period(),0);
if(time_0!=m_prev_bars_2)
{
m_prev_bars_2=time_0;
//--- search for trading signals only at the time of the birth of new barint count_buys=0,count_sells=0;
for(int i=0; i<size; i++)
{
if(SCPos[i].symbol==InpSymbol_2)
{
count_buys=SCPos[i].count_buys;
count_sells=SCPos[i].count_sells;
break;
}
}
if(count_buys+count_sells<InpMaxPositions)
{
double lot=SymbolInfoDouble(InpSymbol_2,SYMBOL_VOLUME_MIN);
if(lot>0.0)
{
MqlRates rates[];
ArraySetAsSeries(rates,true);
int start_pos=0,count=3;
if(CopyRates(InpSymbol_2,Period(),start_pos,count,rates)==count)
{
if(rates[1].open<rates[1].close)
m_trade.Buy(lot,InpSymbol_2);
else
m_trade.Sell(lot,InpSymbol_2);
}
}
}
}
}
//--- Symbol 3if(m_symbol_3)
{
datetime time_0=iTime(InpSymbol_3,Period(),0);
if(time_0!=m_prev_bars_3)
{
m_prev_bars_3=time_0;
//--- search for trading signals only at the time of the birth of new barint count_buys=0,count_sells=0;
for(int i=0; i<size; i++)
{
if(SCPos[i].symbol==InpSymbol_3)
{
count_buys=SCPos[i].count_buys;
count_sells=SCPos[i].count_sells;
break;
}
}
if(count_buys+count_sells<InpMaxPositions)
{
double lot=SymbolInfoDouble(InpSymbol_3,SYMBOL_VOLUME_MIN);
if(lot>0.0)
{
MqlRates rates[];
ArraySetAsSeries(rates,true);
int start_pos=0,count=3;
if(CopyRates(InpSymbol_3,Period(),start_pos,count,rates)==count)
{
if(rates[1].open<rates[1].close)
m_trade.Buy(lot,InpSymbol_3);
else
m_trade.Sell(lot,InpSymbol_3);
}
}
}
}
}
}
Задача: найти объект OBJ_VLINE и получить время объекта.
В коде есть несколько этапов проверок и защит. Первый этап - поиск объекта по имени. Второй этап - получаем тип объекта. Третий этап - без проверки, мы просто получаем время объекта.
Francisco Carlos Sobral Ribeiro : Можно ли перенести часть идентификатора из секции OnInit () в функцию, вызов которой осуществляется в OnInit ()? Возникла ли проблема?
Нельзя. Почему? Потому что вы начнете вызывать эту функцию из OnTick.
***
" В системе хеджирования позиция не может быть отменена. В этом случае текущая позиция закрывается и открывается новая с оставшимся объемом. "Есть ли способ отключить это, чтобы я мог одновременно держать открытые позиции на покупку и продажу по валютной паре?
Я думаю, вам нужно задать свой вопрос на форуме - здесь тема для тех, кто задает вопросы о ПРОГРАММИРОВАНИИ на MQL5, а у вас, как правило, нулевые знания. Вы умудряетесь неправильно трактовать документацию. Пожалуйста, не пишите больше в этой теме - эта тема для тех, кто программирует.
Пример - есть линия(горизонтальная линия или линия тренда), и вам нужно отследить, когда цена пересекает эту линию.
Для этого сначала нужно получить цену линии - но прежде всего мы проверяем, существует ли вообще объект с таким названием? Если такой объект есть, то, в зависимости от типа объекта, мы получаем цену:
Рассчитать позиции для всех символов
Код: 'Рассчитать позиции для всех символов.mq5
Задача: На рынке открыто несколько позиций. Необходимо получить количество позиций (как BUY, так и SELL) по каждому символу.
Предлагаемое решение: создается структура'STRUCT_CALCULATE_POSITIONS'
создается и эта структура заполняется в функции'CalculateAllPositions'
функции.
Например, был создан тестовый советник: сначала он открывает четыре позиции, а затем (после вызова функции 'CalculateAllPositions') распаковывает структуру 'STRUCT_CALCULATE_POSITIONS'.
Результат:
Не более N позиций для каждого символа Простой
.
Еще один пример использования структуры'STRUCT_CALCULATE_POSITIONS'. Советник открывает позицию на новом баре. Стоп-лосс или тейк-профит отсутствуют. Открытые позиции никто не закрывает - это демонстрация того, как использовать и как работать со структурой'STRUCT_CALCULATE_POSITIONS'.
Здравствуйте
Я вообще ничего не понял. Что такое верх? Что такое низ? Задайте свой вопрос в виде картинки.
Поиск последней позиции и вывод информации о ней.
Код: 'Last position info.mq5'
Результат:
Работа с графическим объектом OBJ_VLINE
Задача: найти объект OBJ_VLINE и получить время объекта.
В коде есть несколько этапов проверок и защит. Первый этап - поиск объекта по имени. Второй этап - получаем тип объекта. Третий этап - без проверки, мы просто получаем время объекта.
Хендл должен быть создан ТОЛЬКО ОДИН раз. Наиболее удобным местом для создания идентификатора является OnInit ().
Можно ли перенести часть идентификатора из секции OnInit () в функцию, вызов которой осуществляется в OnInit ()? Возникла ли проблема?
Нельзя. Почему? Потому что вы начнете вызывать эту функцию из OnTick.