Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2022
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Раз есть функция для удаления правых меток, то можно добавить и префикс для них
Раз есть функция для удаления правых меток, равно как и других типов объектов, то она должна выполнять свои «обязанности» беспрекословно…
Раз есть функция для удаления правых меток, то можно добавить и префикс для них
если воспроизводится, что объекты с типами "правая/левая ценовая метка" не удаляются в отличии от прочих типов - ЭТО БАГ
и заметивший это Сергей Найдёнов, вроде как не спрашивал "какими костылями это обойти" :-)
лучше проверьте и подтвердите/опровергните, помогите донести до разработчиков
если воспроизводится, что объекты с типами "правая/левая ценовая метка" не удаляются в отличии от прочих типов - ЭТО БАГ
и заметивший это Сергей Найдёнов, вроде как не спрашивал "какими костылями это обойти" :-)
лучше проверьте и подтвердите/опровергните, помогите донести до разработчиков
Не меньше 11 минут expiration
Спасибо
Цена закрытия неправильная скорее всего. Но с кодом вернее. В справке функция закрытия, надо смотреть что туда передаете.
Код открытия (по-моему тоже со справочника брал)
double Bid = SymbolInfoDouble(Symbol(),SYMBOL_BID),
Ask = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
//--- объявление и инициализация запроса и результата
MqlTradeRequest request={};
MqlTradeResult result={};
//--- параметры запроса
request.action =TRADE_ACTION_DEAL; // тип торговой операции
request.symbol =Symbol(); // символ
request.volume =Lots; // объем в 0.1 лот
request.type =ORDER_TYPE_BUY; // тип ордера
request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // цена для открытия
request.sl =Bid-SL*SymbolInfoDouble(Symbol(),SYMBOL_POINT); // SL
request.tp =0; // TP
request.deviation=5; // допустимое отклонение от цены
request.magic =Magic_Number; // MagicNumber ордера
//--- отправка запроса
Ticket=OrderSend(request,result);
if (Ticket!=0) PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки
//--- информация об операции
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
Открывает позицию, потом на пересечении машек я хочу закрыть позицию
А вот код закрытия
MqlTradeRequest request;
MqlTradeResult result;
double ma,ma2;
//--- get Moving Average
ma=iMA(NULL,_Period,MovingPeriod,MovingShift,ma_method,applied_price);
ma2=iMA(NULL,_Period,MovingPeriod2,MovingShift2,ma_method2,applied_price2);
int total=PositionsTotal(); // количество открытых позиций
//--- перебор всех открытых позиций
for(int i=total-1; i>=0; i--)
{
//--- параметры ордера
ulong position_ticket=PositionGetTicket(i); // тикет позиции
string position_symbol=PositionGetString(POSITION_SYMBOL); // символ
int digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // количество знаков после запятой
ulong magic=PositionGetInteger(POSITION_MAGIC); // MagicNumber позиции
double volume=PositionGetDouble(POSITION_VOLUME); // объем позиции
ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // тип позиции
//--- вывод информации о позиции
PrintFormat("#%I64u %s %s %.2f %s [%I64d]",
position_ticket,
position_symbol,
EnumToString(type),
volume,
DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
magic);
//--- если MagicNumber совпадает
if(magic==Magic_Number)
{
//--- обнуление значений запроса и результата
ZeroMemory(request);
ZeroMemory(result);
//--- установка параметров операции
request.action =TRADE_ACTION_DEAL; // тип торговой операции
request.position =position_ticket; // тикет позиции
request.symbol =position_symbol; // символ
request.volume =volume; // объем позиции
request.deviation=5; // допустимое отклонение от цены
request.magic =Magic_Number; // MagicNumber позиции
//--- установка цены и типа ордера в зависимости от типа позиции
if(type==POSITION_TYPE_BUY && ma<ma2)
{
request.price=SymbolInfoDouble(position_symbol,SYMBOL_BID);
request.type =ORDER_TYPE_SELL;
}
if(type==POSITION_TYPE_SELL && ma>ma2)
{
request.price=SymbolInfoDouble(position_symbol,SYMBOL_ASK);
request.type =ORDER_TYPE_BUY;
}
//--- вывод информации о закрытии
PrintFormat("Close #%I64d %s %s",position_ticket,position_symbol,EnumToString(type));
//--- отправка запроса
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки
//--- информация об операции
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
//---
}
}
И никакой реакции( Вот только
2022.08.21 16:50:36.000 Core 01 2022.07.04 23:59:59 failed instant buy 0.01 EURUSD at 0.00000, close #2 sell 0.01 EURUSD 1.04146 [Invalid price]
Добрый день!
А что ж тестер в MT5 одни инструменты может тестировать, а другие нет?
Истоория есть вроде. Не тестирует эксперт на акциях американских только фьючерсы
Код открытия (по-моему тоже со справочника брал)
double Bid = SymbolInfoDouble(Symbol(),SYMBOL_BID),
Ask = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
//--- объявление и инициализация запроса и результата
MqlTradeRequest request={};
MqlTradeResult result={};
//--- параметры запроса
request.action =TRADE_ACTION_DEAL; // тип торговой операции
request.symbol =Symbol(); // символ
request.volume =Lots; // объем в 0.1 лот
request.type =ORDER_TYPE_BUY; // тип ордера
request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // цена для открытия
request.sl =Bid-SL*SymbolInfoDouble(Symbol(),SYMBOL_POINT); // SL
request.tp =0; // TP
request.deviation=5; // допустимое отклонение от цены
request.magic =Magic_Number; // MagicNumber ордера
//--- отправка запроса
Ticket=OrderSend(request,result);
if (Ticket!=0) PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки
//--- информация об операции
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
Открывает позицию, потом на пересечении машек я хочу закрыть позицию
А вот код закрытия
MqlTradeRequest request;
MqlTradeResult result;
double ma,ma2;
//--- get Moving Average
ma=iMA(NULL,_Period,MovingPeriod,MovingShift,ma_method,applied_price);
ma2=iMA(NULL,_Period,MovingPeriod2,MovingShift2,ma_method2,applied_price2);
int total=PositionsTotal(); // количество открытых позиций
//--- перебор всех открытых позиций
for(int i=total-1; i>=0; i--)
{
//--- параметры ордера
ulong position_ticket=PositionGetTicket(i); // тикет позиции
string position_symbol=PositionGetString(POSITION_SYMBOL); // символ
int digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // количество знаков после запятой
ulong magic=PositionGetInteger(POSITION_MAGIC); // MagicNumber позиции
double volume=PositionGetDouble(POSITION_VOLUME); // объем позиции
ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // тип позиции
//--- вывод информации о позиции
PrintFormat("#%I64u %s %s %.2f %s [%I64d]",
position_ticket,
position_symbol,
EnumToString(type),
volume,
DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
magic);
//--- если MagicNumber совпадает
if(magic==Magic_Number)
{
//--- обнуление значений запроса и результата
ZeroMemory(request);
ZeroMemory(result);
//--- установка параметров операции
request.action =TRADE_ACTION_DEAL; // тип торговой операции
request.position =position_ticket; // тикет позиции
request.symbol =position_symbol; // символ
request.volume =volume; // объем позиции
request.deviation=5; // допустимое отклонение от цены
request.magic =Magic_Number; // MagicNumber позиции
//--- установка цены и типа ордера в зависимости от типа позиции
if(type==POSITION_TYPE_BUY && ma<ma2)
{
request.price=SymbolInfoDouble(position_symbol,SYMBOL_BID);
request.type =ORDER_TYPE_SELL;
}
if(type==POSITION_TYPE_SELL && ma>ma2)
{
request.price=SymbolInfoDouble(position_symbol,SYMBOL_ASK);
request.type =ORDER_TYPE_BUY;
}
//--- вывод информации о закрытии
PrintFormat("Close #%I64d %s %s",position_ticket,position_symbol,EnumToString(type));
//--- отправка запроса
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки
//--- информация об операции
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
//---
}
}
И никакой реакции( Вот только
2022.08.21 16:50:36.000 Core 01 2022.07.04 23:59:59 failed instant buy 0.01 EURUSD at 0.00000, close #2 sell 0.01 EURUSD 1.04146 [Invalid price]
У вас в тип сделки в закрытии стоит TRADE_ACTION_DEAL; Вроде ошибка в доках. Это на открытие вроде по текущей цене. Так позицию можно закрыть открытием позиции в противоположном направлении с тем же лотом. Может лучше
TRADE_ACTION_CLOSE_BY
У вас в тип сделки в закрытии стоит TRADE_ACTION_DEAL; Вроде ошибка в доках. Это на открытие вроде по текущей цене. Так позицию можно закрыть открытием позиции в противоположном направлении с тем же лотом. Может лучше
TRADE_ACTION_CLOSE_BY
Код открытия (по-моему тоже со справочника брал)
double Bid = SymbolInfoDouble(Symbol(),SYMBOL_BID),
Ask = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
//--- объявление и инициализация запроса и результата
MqlTradeRequest request={};
MqlTradeResult result={};
//--- параметры запроса
request.action =TRADE_ACTION_DEAL; // тип торговой операции
request.symbol =Symbol(); // символ
request.volume =Lots; // объем в 0.1 лот
request.type =ORDER_TYPE_BUY; // тип ордера
request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // цена для открытия
request.sl =Bid-SL*SymbolInfoDouble(Symbol(),SYMBOL_POINT); // SL
request.tp =0; // TP
request.deviation=5; // допустимое отклонение от цены
request.magic =Magic_Number; // MagicNumber ордера
//--- отправка запроса
Ticket=OrderSend(request,result);
if (Ticket!=0) PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки
//--- информация об операции
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
Открывает позицию, потом на пересечении машек я хочу закрыть позицию
А вот код закрытия
MqlTradeRequest request;
MqlTradeResult result;
double ma,ma2;
//--- get Moving Average
ma=iMA(NULL,_Period,MovingPeriod,MovingShift,ma_method,applied_price);
ma2=iMA(NULL,_Period,MovingPeriod2,MovingShift2,ma_method2,applied_price2);
int total=PositionsTotal(); // количество открытых позиций
//--- перебор всех открытых позиций
for(int i=total-1; i>=0; i--)
{
//--- параметры ордера
ulong position_ticket=PositionGetTicket(i); // тикет позиции
string position_symbol=PositionGetString(POSITION_SYMBOL); // символ
int digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // количество знаков после запятой
ulong magic=PositionGetInteger(POSITION_MAGIC); // MagicNumber позиции
double volume=PositionGetDouble(POSITION_VOLUME); // объем позиции
ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // тип позиции
//--- вывод информации о позиции
PrintFormat("#%I64u %s %s %.2f %s [%I64d]",
position_ticket,
position_symbol,
EnumToString(type),
volume,
DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
magic);
//--- если MagicNumber совпадает
if(magic==Magic_Number)
{
//--- обнуление значений запроса и результата
ZeroMemory(request);
ZeroMemory(result);
//--- установка параметров операции
request.action =TRADE_ACTION_DEAL; // тип торговой операции
request.position =position_ticket; // тикет позиции
request.symbol =position_symbol; // символ
request.volume =volume; // объем позиции
request.deviation=5; // допустимое отклонение от цены
request.magic =Magic_Number; // MagicNumber позиции
//--- установка цены и типа ордера в зависимости от типа позиции
if(type==POSITION_TYPE_BUY && ma<ma2)
{
request.price=SymbolInfoDouble(position_symbol,SYMBOL_BID);
request.type =ORDER_TYPE_SELL;
}
if(type==POSITION_TYPE_SELL && ma>ma2)
{
request.price=SymbolInfoDouble(position_symbol,SYMBOL_ASK);
request.type =ORDER_TYPE_BUY;
}
//--- вывод информации о закрытии
PrintFormat("Close #%I64d %s %s",position_ticket,position_symbol,EnumToString(type));
//--- отправка запроса
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки
//--- информация об операции
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
//---
}
}
И никакой реакции( Вот только
2022.08.21 16:50:36.000 Core 01 2022.07.04 23:59:59 failed instant buy 0.01 EURUSD at 0.00000, close #2 sell 0.01 EURUSD 1.04146 [Invalid price]
что показывают индикаторы?, видимо NULL
У вас в тип сделки в закрытии стоит TRADE_ACTION_DEAL; Вроде ошибка в доках. Это на открытие вроде по текущей цене. Так позицию можно закрыть открытием позиции в противоположном направлении с тем же лотом. Может лучше
TRADE_ACTION_CLOSE_BY
что показывают индикаторы?, видимо NULL
Ой, хороший вопрос. Один показывает "10", второй "11" на постоянной основе при принте.
2022.08.21 17:46:53.192 Core 01 2022.07.04 23:59:41 ma= 10.0 ma2 = 11.0
UPD
Заглянул в стандартный советник на машках в МТ5, действительно, как-то по-другому выражается машка. Квадратные скобки, как у массива
Ой, хороший вопрос. Один показывает "10", второй "11" на постоянной основе при принте.
2022.08.21 17:46:53.192 Core 01 2022.07.04 23:59:41 ma= 10.0 ma2 = 11.0
UPD
Заглянул в стандартный советник на машках в МТ5, действительно, как-то по-другому выражается машка. Квадратные скобки, как у массива