Можно ли в MQL5 сформировать торговый запрос как в MQL4, в кавычках OrderSend ( в MQL4, это формула OrderModify(); ), самостоятельно прописать данные для запроса, TRADE_ACTION_SLTP и т.д. или, как посмотреть исходный скрипт формул OrderSend и MqlTradeRequest, в каком файле хранятся скрипты этих формул? Проблема в том, что на хеджинге (проверил, запрос подтверждает хеджинг) запрос формируется как на нетинге, не указывается тикет, формируется запрос на модификацию по символу, а не по тикету.
например, открыто 2 позиции с тикетами 2 и 3, идет перебор for( int i= и т.д., при первом заходе модифицируется тикет №2, при втором заходе выбирает тикет №3, в request.position=3, а модифицировать вновь пытается тикет №2, result показывает 2
Для начала начните пользовать простой вариант - в котором минимум настроек:
подключаете торговые классы стандартной библиотеки
#include <Trade\PositionInfo.mqh> // работа с позициями #include <Trade\Trade.mqh> // торговые операции #include <Trade\SymbolInfo.mqh> // класс символа
Тогда простой подсчёт позиций выглядит как:
//+------------------------------------------------------------------+ //| Calculate all positions | //+------------------------------------------------------------------+ int CalculateAllPositions() { int total=0; for(int i=PositionsTotal()-1;i>=0;i--) if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic) total++; //--- return(total); }
а трейлинг позиций так:
//+------------------------------------------------------------------+ //| Trailing | //+------------------------------------------------------------------+ void Trailing(const double ma_open_1, const double ma_open_signal_bar, const double ma_close_1, const double ma_close_signal_bar) { if(InpTrailingStop==0) return; for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions if(m_position.SelectByIndex(i)) if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic) { if(m_position.PositionType()==POSITION_TYPE_BUY) { if(ma_open_1<ma_open_signal_bar) { m_trade.PositionClose(m_position.Ticket()); continue; } if(InpTrailingStop>0) if(m_position.PriceCurrent()-m_position.PriceOpen()>ExtTrailingStop+ExtTrailingStep) if(m_position.StopLoss()<m_position.PriceCurrent()-(ExtTrailingStop+ExtTrailingStep)) { if(!m_trade.PositionModify(m_position.Ticket(), m_symbol.NormalizePrice(m_position.PriceCurrent()-ExtTrailingStop), m_position.TakeProfit())) Print("Modify ",m_position.Ticket(), " Position -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); continue; } } else { if(ma_open_1>ma_open_signal_bar) { m_trade.PositionClose(m_position.Ticket()); continue; } if(InpTrailingStop>0) if(m_position.PriceOpen()-m_position.PriceCurrent()>ExtTrailingStop+ExtTrailingStep) if((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTrailingStop+ExtTrailingStep))) || (m_position.StopLoss()==0)) { if(!m_trade.PositionModify(m_position.Ticket(), m_symbol.NormalizePrice(m_position.PriceCurrent()+ExtTrailingStop), m_position.TakeProfit())) Print("Modify ",m_position.Ticket(), " Position -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); } } } }
Код взят из примера Brandy
Для начала начните пользовать простой вариант - в котором минимум настроек:
подключаете торговые классы стандартной библиотеки
Тогда простой подсчёт позиций выглядит как:
а трейлинг позиций так:
Код взят из примера Brandy
Не имеет значения, запрос формирует и отправляет MqlRequest и OrderSend, в CTrade все еще хуже, он всегда, даже при хеджинге, модифицируется наименьший тикет, не наибольший, не последний, а именно первый и в этом нет никакого смысла, нисколько не проще, у меня формирование приказа занимает 20-30 строк кода и у вас так же, и это без учета тысяч лишних строк кода, нагрузки на проц и времени
В документации есть все примеры и все классы стандартной библиотеки.
PositionModify имеет перегрузку и отправлять запрос можно и нужно не по символу, а по тикету позиции.
bool PositionModify( const ulong ticket, // тикет позиции double sl, // цена Stop Loss double tp // цена Take Profit )
- www.mql5.com
В документации есть все примеры и все классы стандартной библиотеки.
PositionModify имеет перегрузку и отправлять запрос можно и нужно не по символу, а по тикету позиции.
В документации есть все примеры и все классы стандартной библиотеки.
PositionModify имеет перегрузку и отправлять запрос можно и нужно не по символу, а по тикету позиции.
Вы знаете, как посмотреть скрипт формулы? Вроде можно выделить OrderSend, выполнить манипуляции и должен открыться файл с этой формулой. Он отправляет в OrderSend запрос Request без тикетов и ордеров, как OrderSend определяет тикет позиции непонятно
//--- установка параметров операции request.action =TRADE_ACTION_SLTP; // тип торговой операции request.position=position_ticket; // тикет позиции request.symbol=position_symbol; // символ request.sl =sl; // Stop Loss позиции request.tp =tp; // Take Profit позиции request.magic=EXPERT_MAGIC; // MagicNumber позиции
Это из примера функции в документации.
К сожалению после введения hadge в MT5 не всё в документации исправлено. Видимо вас сбило с толку начало
SL & TP Modification
Торговый приказ на модификацию уровней StopLoss и/или TakeProfit. Требуется указание 4 полей:
- action
- symbol
- sl
- tp
- position
тикет-то тут отсутствует...
Примерно как про того суслика... "Ты суслика видишь?". "Нет." Не видишь, а он есть :))))
Все коды стандартной библиотеки находятся в папке Include
- www.mql5.com
Это из примера функции в документации.
К сожалению после введения hadge в MT5 не всё в документации исправлено. Видимо вас сбило с толку начало
тикет-то тут отсутствует...
Примерно как про того суслика... "Ты суслика видишь?". "Нет." Не видишь, а он есть :))))
Все коды стандартной библиотеки находятся в папке Include
Поэтому я хочу попробовать сформировать запрос сам, как было в MQL4: OrderModify(ticket,price, ....), указать тикет, чтобы избежать проблем в будущем, опасность в том, что в запросе на закрытие, тикета тоже нет, пока позиции закрываются вроде нормально, но если он начнет закрывать позиции "от фонаря", то будет беда, попробую найти исходники формул в include
Я Вам показал пример выше: абсолютно все функции работают через указание тикета.
Пожалуйста разберитесь.
Я Вам показал пример выше: абсолютно все функции работают через указание тикета.
Пожалуйста разберитесь.
Вот запрос формируемый request на модификацию,
MqlTradeRequest{ action:TRADE_ACTION_SLTP magic:201010 order:0 symbol:"EURUSD_i" volume:0.0 price:0.0 stoplimit:0.0 sl:1.2322500000000001 tp:1.2342500000000001 deviation:0 type:ORDER_TYPE_BUY type_filling:ORDER_FILLING_FOK type_time:ORDER_TIME_GT… }
запрос на закрытие
MqlTradeRequest{ action:TRADE_ACTION_DEAL magic:201010 order:0 symbol:"EURUSD_i" volume:0.01 price:1.23227 stoplimit:0.0 sl:0.0 tp:0.0 deviation:2 type:ORDER_TYPE_SELL type_filling:ORDER_FILLING_FOK type_time:ORDER_TIME_GTC expiration… }
где тикеты?
Вот запрос формируемый request на модификацию,
запрос на закрытие
где тикеты?
Я Вам показал путь для начинающих - через торговые классы. Не хотите - ну что ж, я умываю руки.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Можно ли в MQL5 сформировать торговый запрос как в MQL4, в кавычках OrderSend ( в MQL4, это формула OrderModify(); ), самостоятельно прописать данные для запроса, TRADE_ACTION_SLTP и т.д. или, как посмотреть исходный скрипт формул OrderSend и MqlTradeRequest, в каком файле хранятся скрипты этих формул? Проблема в том, что на хеджинге (проверил, запрос подтверждает хеджинг) запрос формируется как на нетинге, не указывается тикет, формируется запрос на модификацию по символу, а не по тикету.
например, открыто 2 позиции с тикетами 2 и 3, идет перебор for( int i= и т.д., при первом заходе модифицируется тикет №2, при втором заходе выбирает тикет №3, в request.position=3, а модифицировать вновь пытается тикет №2, result показывает 2