Ну я и спросил - зачем цеплять советник на все нужные графики, если его можно прицепить на один и спокойно работать со всеми нужными символами и таймфреймами...
Тогда и колдовать с открытыми графиками не придётся.
Ну я и спросил - зачем цеплять советник на все нужные графики, если его можно прицепить на один и спокойно работать со всеми нужными символами и таймфреймами...
Тогда и колдовать с открытыми графиками не придётся.
да, мультисимвольность наверно самое правильное решение
Evgeny Dyuka: вот это интересно, не дадите правильную ссылочку? чтоб 500 вариантов из гугла не перебирать
Увы, кроме названия я ничего не знаю об этом. Пробовал распечатать список ордеров в истории, получилось, но ведь это только проба. Ещё знаю что сервис можно зациклить и он не будет мешать другим работающим программам на терминале. В принципе, это скрипт. Отличается только тем, что работает без графика.
Приветствую. Посмотрел грамотный ролик "Из MQL4 в MQL5 - как переписать советник под Metatrader 5". Большой респект автору. Решил сам попробовать. Написал. Идея такая : 1. В инпутах устанавливаю dtriger = 1 - открывается Buy. 2. В инпутах устанавливаю dtriger = -1 - открывается Sell. 3. В инпутах устанавливаю dtriger = 0 - закрываются все открытые. Читал в хелпах, что в MT5 не возможно держать встречные позичии, а у меня они присуствуют. Вопрос : как корректно прописать закрытие действующей позиции при открытии встречной (переворотной). Премного благодарен.
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\OrderInfo.mqh>
CPositionInfo o_position;
CTrade o_trade;
CSymbolInfo o_symbol;
COrderInfo o_order;
inputint triger = 0;
inputdouble StartLot = 0.01;
inputdouble lpos_volume = 1.0;
inputint Step = 10;
inputint MagicNumber = 12345; // Magic nuaberinputint Slippage = 30; // slippageint dtriger;
int dStep;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
dStep = Step ;
dtriger = triger ;
if (!o_symbol.Name(Symbol()))
return(INIT_FAILED);
RefreshRates();
o_trade.SetExpertMagicNumber(MagicNumber) ;
if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_FOK))
{
o_trade.SetTypeFilling(ORDER_FILLING_FOK);
}
elseif (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_IOC))
{
o_trade.SetTypeFilling(ORDER_FILLING_IOC);
}
else
{
o_trade.SetTypeFilling(ORDER_FILLING_RETURN);
}
o_trade.SetDeviationInPoints(Slippage);
if (o_symbol.Digits() == 3 || o_symbol.Digits() == 5 )
{
dStep = 10 ;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
datetime lpos_time = 0;
double lpos_price_open = 0.0;
ENUM_POSITION_TYPE lpos_type = -1;
int pos_count = 0;
double sum_profit = 0;
for (int i = PositionsTotal() - 1; i>=0; i--)
{
if (o_position.SelectByIndex(i))
{
if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
{
if (o_position.Time() > lpos_time)
{
lpos_time = o_position.Time(); //OrderOpenTime();
lpos_price_open = o_position.PriceOpen(); //OrderOpenPrice();
lpos_type = o_position.PositionType() ; //OrderTipe();
}
pos_count++;
sum_profit = sum_profit + o_position.Commission() + o_position.Swap() + o_position.Profit() ;
}
}
}
// Считаем кол-во отложенных ордеровint stop_count=0;
for (int i=OrdersTotal()-1; i >=0; i--)
{
if (o_order.SelectByIndex(i))
{
if (o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
stop_count++;
}
}
if (!RefreshRates())
return ;
if(dtriger == 0 )
{
CloseAll();
return;
}
// + ----- Откраваем Первый ордер ++++++++++if (pos_count == 0 && stop_count == 0 )
{
if ( dtriger == -1 && lpos_type != POSITION_TYPE_SELL)
{
o_trade.Sell(StartLot * lpos_volume , o_symbol.Name()); // S E L L 11111
}
if ( dtriger == 1 && lpos_type != POSITION_TYPE_BUY )
{
o_trade.Buy(StartLot * lpos_volume , o_symbol.Name()); // B U Y 11111
}
}
// + ----- Переворот ++++++++++++++++++++++++++++ if (pos_count>0)
{
if(lpos_type == POSITION_TYPE_BUY )
{
if ( dtriger == -1 )
{
o_trade.Sell(StartLot * lpos_volume , o_symbol.Name()); // S E L L +++++
}
}
if (lpos_type==POSITION_TYPE_SELL )
{
if ( dtriger == 1 )
{
o_trade.Buy(StartLot * lpos_volume , o_symbol.Name()); // B U Y +++++
}
}
}
if(pos_count>0 && stop_count>0)
DeleteStopOrders() ;
}
//-----------------------------------------------------------bool RefreshRates()
{
if (!o_symbol.RefreshRates())
return(false) ;
if (o_symbol.Ask() == 0 || o_symbol.Bid() == 0)
return(false);
return(true);
}
//--- --------------------------------------------------------- bool IsFillingTypeAllowed (string symbol, int fill_type)
{
int filling = (int)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);
return((filling && fill_type) == fill_type) ;
}
// -------------------------------------------------- void CloseAll()
{
for (int index = PositionsTotal()-1; index >=0; index--)
{
if (o_position.SelectByIndex(index))
{
if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
{
o_trade.PositionClose(o_position.Ticket());
}
}
}
}
//----------------------------------------------------------- // Delete all pending orders//-------------------------------------void DeleteStopOrders()
{
for (int i = OrdersTotal() - 1; i >= 0; i-- )
{
if (o_order.SelectByIndex(i))
if(o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
o_trade.OrderDelete(o_order.Ticket());
}
}
//+------------------------------------------------------------------+
Приветствую. Посмотрел грамотный ролик "Из MQL4 в MQL5 - как переписать советник под Metatrader 5". Большой респект автору. Решил сам попробовать. Написал. Идея такая : 1. В инпутах устанавливаю dtriger = 1 - открывается Buy. 2. В инпутах устанавливаю dtriger = -1 - открывается Sell. 3. В инпутах устанавливаю dtriger = 0 - закрываются все открытые. Читал в хелпах, что в MT5 не возможно держать встречные позичии, а у меня они присуствуют. Вопрос : как корректно прописать закрытие действующей позиции при открытии встречной (переворотной). Премного благодарен.
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
если нужно открыть BUY - то сначала нужно закрыть SELL (выдать команду на закрытие SELL позиций - при этом не важно есть они или нет)
если нужно открыть SELL - то сначала нужно закрыть BUY (выдать команду на закрытие BUY позиций - при этом не важно есть они или нет)
если нужно закрыть все - то просто закрыть все (не важно BUY они или SELL)
Для реализации нужно два алгоритма (здесь ещё участвует уникальный идентификатор - magic number) - его можно и отключить.
//+------------------------------------------------------------------+//| Close positions |//+------------------------------------------------------------------+void ClosePositions(constENUM_POSITION_TYPE pos_type)
{
for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of current positionsif(m_position.SelectByIndex(i)) // selects the position by index for further access to its propertiesif(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)
if(m_position.PositionType()==pos_type) // gets the position type
m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
}
и
//+------------------------------------------------------------------+//| Close all positions |//+------------------------------------------------------------------+void CloseAllPositions(void)
{
for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of current positionsif(m_position.SelectByIndex(i)) // selects the position by index for further access to its propertiesif(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)
m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
}
Общий смысл - обход всех позиций в цикле от PositionsTotal()-1 к 0. Именно от PositionsTotal()-1 в нулю, а не от нуля к PositionsTotal()-1. Это важно.
Также ещё совет: при работе в MetaTrader 5 ордер - это ОТЛОЖЕННЫЙ ОРДЕР. Поэтому Вам на начальном этапе крайне не рекомендуется даже вспоминать слово "Ордер" - дабы не создавать сумятицу в мыслях.
Vladimir Karputov: Также ещё совет: при работе в MetaTrader 5 ордер - это ОТЛОЖЕННЫЙ ОРДЕР. Поэтому Вам на начальном этапе крайне не рекомендуется даже вспоминать слово "Ордер" - дабы не создавать сумятицу в мыслях.
Есть ещё маркет-ордеры Buy и Sell, а также закрывающий ордер CloseBy.
читайте внимательно:
тут как бы логика изначально хромает на обе лапы ))), он просто не знает как работает терминал, поэтому и вопросы такие ;)
по сабжу, начните с чтения документации, а потом варианты решения проблемы сами отпадут
https://www.metatrader5.com/ru/terminal/help/startworking/settings
https://www.mql5.com/ru/docs/event_handlers/ontick
Ну я и спросил - зачем цеплять советник на все нужные графики, если его можно прицепить на один и спокойно работать со всеми нужными символами и таймфреймами...
Тогда и колдовать с открытыми графиками не придётся.
Ну я и спросил - зачем цеплять советник на все нужные графики, если его можно прицепить на один и спокойно работать со всеми нужными символами и таймфреймами...
Тогда и колдовать с открытыми графиками не придётся.
Может попытаться создать сервис? Он не цепляется к графику.
вот это интересно, не дадите правильную ссылочку? чтоб 500 вариантов из гугла не перебирать
Увы, кроме названия я ничего не знаю об этом. Пробовал распечатать список ордеров в истории, получилось, но ведь это только проба. Ещё знаю что сервис можно зациклить и он не будет мешать другим работающим программам на терминале. В принципе, это скрипт. Отличается только тем, что работает без графика.
Приветствую. Посмотрел грамотный ролик "Из MQL4 в MQL5 - как переписать советник под Metatrader 5".
Большой респект автору. Решил сам попробовать. Написал. Идея такая :
1. В инпутах устанавливаю dtriger = 1 - открывается Buy.
2. В инпутах устанавливаю dtriger = -1 - открывается Sell.
3. В инпутах устанавливаю dtriger = 0 - закрываются все открытые.
Читал в хелпах, что в MT5 не возможно держать встречные позичии,
а у меня они присуствуют.
Вопрос : как корректно прописать закрытие действующей позиции при
открытии встречной (переворотной).
Премного благодарен.
Приветствую. Посмотрел грамотный ролик "Из MQL4 в MQL5 - как переписать советник под Metatrader 5".
Большой респект автору. Решил сам попробовать. Написал. Идея такая :
1. В инпутах устанавливаю dtriger = 1 - открывается Buy.
2. В инпутах устанавливаю dtriger = -1 - открывается Sell.
3. В инпутах устанавливаю dtriger = 0 - закрываются все открытые.
Читал в хелпах, что в MT5 не возможно держать встречные позичии,
а у меня они присуствуют.
Вопрос : как корректно прописать закрытие действующей позиции при
открытии встречной (переворотной).
Премного благодарен.
Видно очень невнимательно читали справку.
Справка: Общие принципы - Торговые операции.
Суть: в MetaTrader 5 есть как Неттинговая система так и Хеджинговая система.
А Ваше задание я бы сформулировал по-другому:
1. dtriger = 1 - открывается Buy.
2. dtriger = -1 - открывается Sell.
3. dtriger = 0 - закрываются все открытые.
А советник должен делать так:
Для реализации нужно два алгоритма (здесь ещё участвует уникальный идентификатор - magic number) - его можно и отключить.
и
Общий смысл - обход всех позиций в цикле от PositionsTotal()-1 к 0. Именно от PositionsTotal()-1 в нулю, а не от нуля к PositionsTotal()-1. Это важно.
Также ещё совет: при работе в MetaTrader 5 ордер - это ОТЛОЖЕННЫЙ ОРДЕР. Поэтому Вам на начальном этапе крайне не рекомендуется даже вспоминать слово "Ордер" - дабы не создавать сумятицу в мыслях.
Есть ещё маркет-ордеры Buy и Sell, а также закрывающий ордер CloseBy.
Спасибо огромное, как по нотам.