Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2022

 
Tretyakov Rostyslav #:
Раз есть функция для удаления правых меток, то можно добавить и префикс для них

Раз есть функция для удаления правых меток, равно как и других типов объектов, то она должна выполнять свои «обязанности» беспрекословно…

 
Tretyakov Rostyslav #:
Раз есть функция для удаления правых меток, то можно добавить и префикс для них

если воспроизводится, что объекты с типами "правая/левая ценовая метка" не удаляются в отличии от прочих типов - ЭТО БАГ

и заметивший это Сергей Найдёнов, вроде как не спрашивал "какими костылями это обойти" :-) 

лучше проверьте и подтвердите/опровергните, помогите донести до разработчиков

 
Maxim Kuznetsov #:

если воспроизводится, что объекты с типами "правая/левая ценовая метка" не удаляются в отличии от прочих типов - ЭТО БАГ

и заметивший это Сергей Найдёнов, вроде как не спрашивал "какими костылями это обойти" :-) 

лучше проверьте и подтвердите/опровергните, помогите донести до разработчиков

Подтверждаю, ни правую ни левую метку не удаляет.
 
Valeriy Yastremskiy #:

Не меньше 11 минут   expiration 

Спасибо

 
Valeriy Yastremskiy #:

Цена закрытия неправильная скорее всего. Но с кодом вернее. В справке функция закрытия, надо смотреть что туда передаете.

Код открытия (по-моему тоже со справочника брал)

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 одни инструменты может тестировать, а другие нет? 

Истоория есть вроде. Не тестирует эксперт  на акциях американских только фьючерсы

 
Ivan Butko #:

Код открытия (по-моему тоже со справочника брал)

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; Вроде ошибка в доках. Это на открытие вроде по текущей цене. Так позицию можно закрыть открытием позиции в противоположном направлении с тем же лотом. Может лучше 

 
Valeriy Yastremskiy #:

У вас в тип сделки в закрытии стоит  TRADE_ACTION_DEAL; Вроде ошибка в доках. Это на открытие вроде по текущей цене. Так позицию можно закрыть открытием позиции в противоположном направлении с тем же лотом. Может лучше 

Ivan Butko #:

Код открытия (по-моему тоже со справочника брал)

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]


    ma=iMA(NULL,_Period,MovingPeriod,MovingShift,ma_method,applied_price);

    ma2=iMA(NULL,_Period,MovingPeriod2,MovingShift2,ma_method2,applied_price2);

что показывают индикаторы?, видимо NULL

 
Valeriy Yastremskiy #:

У вас в тип сделки в закрытии стоит  TRADE_ACTION_DEAL; Вроде ошибка в доках. Это на открытие вроде по текущей цене. Так позицию можно закрыть открытием позиции в противоположном направлении с тем же лотом. Может лучше 

Vladimir Deryagin #:

что показывают индикаторы?, видимо NULL

Ой, хороший вопрос. Один показывает "10", второй "11" на постоянной основе при принте. 

2022.08.21 17:46:53.192 Core 01 2022.07.04 23:59:41    ma= 10.0   ma2 = 11.0

Ничего не пойму, но понял в какую сторону смотреть)) Спасибо) Я после mql4, тут попроще с этим

UPD
Заглянул в стандартный советник на машках в МТ5, действительно, как-то по-другому выражается машка. Квадратные скобки, как у массива
 
Ivan Butko #:

Ой, хороший вопрос. Один показывает "10", второй "11" на постоянной основе при принте. 

2022.08.21 17:46:53.192 Core 01 2022.07.04 23:59:41    ma= 10.0   ma2 = 11.0

Ничего не пойму, но понял в какую сторону смотреть)) Спасибо) Я после mql4, тут попроще с этим

UPD
Заглянул в стандартный советник на машках в МТ5, действительно, как-то по-другому выражается машка. Квадратные скобки, как у массива
Вы получаете значение хэндлов созданных индикаторов (10 и 11).
Чтобы получать значения от созданных индикаторов, нужно использовать CopyBuffer() для нужного индикатора, указав хэндл этого индикатора в параметрах функции
Причина обращения: