Причина возникновения ошибки 4756 - страница 3

 
Renat Akhtyamov:

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

Приведите выкопировку из кода по модификации позиции

Ренат, привожу текст скрипта на модификацию:

// Если имеем один рыночный ордер, то этот Script модифицирует
// этот ордер, выставляя SL=70 пп и TP=10 пп.
#property strict

#ifdef __MQL4__
    #include "d:\_mq4\#__Библ.mq4"
#endif
#ifdef __MQL5__
    #include "d:\_mq4\#_B_Библ.mq5"
#endif

#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>

CPositionInfo Pozicii;
CTrade        Sdelki;//Сделки;

void OnStart()
{
   MessageBox("Скрипт стартовал !");

   int SL=70, TP=10;
   double _SL=Перевод_пунк_в_дробь(SL), _TP=Перевод_пунк_в_дробь(TP), ЦО=0.;
   double СЛ=0., ТП=0.;
   
    ResetLastError();// -сбросим код последней ошибки в ноль;

      for(int i=PositionsTotal()-1; i>=0; i--)
      {
         if(Pozicii.SelectByIndex(i))
         {
            if(Pozicii.Symbol()==Symbol() )
            {                
               if(Pozicii.PositionType()==POSITION_TYPE_BUY)
                 { 
                   ЦО = Pozicii.PriceOpen(); СЛ=ЦО-_SL; ТП=ЦО+_TP;
                   Sdelki.PositionModify(Pozicii.Ticket(),NormalizeDouble(СЛ,Digits()),NormalizeDouble(ТП,Digits()));
                 }
               if(Pozicii.PositionType()==POSITION_TYPE_SELL)
                 {
                   ЦО = Pozicii.PriceOpen(); СЛ=ЦО+_SL; ТП=ЦО-_TP;
                   Sdelki.PositionModify(Pozicii.Ticket(),NormalizeDouble(СЛ,Digits()),NormalizeDouble(ТП,Digits()));
                 }
            }
         }
      }
   int Ошибка=GetLastError();
   MessageBox("Ошибка скрипта: "+IntegerToString(Ошибка));

}


 

 
Victor Ziborov:

Ренат, привожу текст скрипта на модификацию:


 

Вырезал по максимуму. Оставил только модификацию позиции BUY: просто пытаемся тупо выставить SL и TP заданные во входных параметрах.

Как результат:

CTrade::OrderSend: modify position #323221286 GBPUSD (sl: 1.27716, tp: 1.28716) [market closed]
Modify 323221286 Position -> false. Result Retcode: 10018, description of result: market closed
File: Stop Loss Take Profit.mq5, symbol: GBPUSD
Code of request result: 10018
code of request result as a string: market closed
Deal ticket: 0
Order ticket: 0
Volume of deal or order: 0.00
Price, confirmed by broker: 0.00000
Current bid price: 1.28216 (the requote): 0.00000
Current ask price: 1.28332 (the requote): 0.00000
Broker comment: Market closed
Freeze Level: 0, Stops Level: 0
Price of position opening: 1.28702
Price of position's Stop Loss: 0.00000
Price of position's Take Profit: 1.28816
Current price by position: 1.28216

закономерно получаем 10018.


ВНИМАНИЕ: данный код НЕЛЬЗЯ применять в реале! Здесь не анализруется текущий SL и TP у позиции, нет проверки на уровни заморозки и отступа ...

Файлы:
 
Victor Ziborov:

Ренат, привожу текст скрипта на модификацию:

и эту функцию бы глянуть:

_SL=Перевод_пунк_в_дробь(SL)
 
Vladimir Karputov:

Вырезал по максимуму. Оставил только модификацию позиции BUY: просто пытаемся тупо выставить SL и TP заданные во входных параметрах.

Как результат:

закономерно получаем 10018.


ВНИМАНИЕ: данный код НЕЛЬЗЯ применять в реале! Здесь не анализруется текущий SL и TP у позиции, нет проверки на уровни заморозки и отступа ...

Владимир, я попробовал Ваш скрипт. Действительно, получил ожидаемый результат 10018, то есть рынок закрыт. Я буду совершенствовать этот скрипт: добавлю модификацию для POSITION_TYPE_SELL, добавлю анализ SL и TP на предмет того, может они уже такие, как я хочу, и, следовательно, в модификации не нуждаются. Не знаю, есть ли смысл проверять уровни заморозки и отступа.

В любом случае, огромное Вам спасибо за хлопоты ! Можно было, конечно, найти в Code Base такой уже готовый скрипт. Но хотелось бы иметь свой скрипт, которым я лично умею управлять, исправлять ...

 
Victor Ziborov:

Владимир, я попробовал Ваш скрипт. Действительно, получил ожидаемый результат 10018, то есть рынок закрыт. Я буду совершенствовать этот скрипт: добавлю модификацию для POSITION_TYPE_SELL, добавлю анализ SL и TP на предмет того, может они уже такие, как я хочу, и, следовательно, в модификации не нуждаются. Не знаю, есть ли смысл проверять уровни заморозки и отступа.

В любом случае, огромное Вам спасибо за хлопоты ! Можно было, конечно, найти в Code Base такой уже готовый скрипт. Но хотелось бы иметь свой скрипт, которым я лично умею управлять, исправлять ...

Вот и ладненько. Счёт вытираю из своего терминала.

 
Renat Akhtyamov:

и эту функцию бы глянуть:

Ренат, я эту функцию не держу в секрете. Может, она Вам не понравится, но она у меня работает надёжно. На вход поступают четырехзначные старые пункты, например, 90 пп. Эта функция переводит их в дробь: в 0.00900:

double Перевод_пунк_в_дробь(double X)
{
   double Y = 0;
   // Определяем 4 или 5-значность ДЦ:
   if( Digits() == 5) Y = X*10*Point();
   if( Digits() == 4) Y = X*Point();   
   if( Digits() == 3) Y = X*10*Point();
   if( Digits() == 2) Y = X*Point();
   if( Digits() == 1) Y = X*10*Point();
   if( Digits() == 0) Y = X;
Y = NormalizeDouble(Y, Digits());
return Y;
}


 

 
Victor Ziborov:
Сегодня воскресенье. Рынок закрыт. Отлаживаю скрипт по модификации СЛ и ТП открытой позиции в mql5 с помощью PositionModify. Тоже получаю ошибку 4756 (после GetLastError()). Но если рынок закрыт (воскресенье), то ошибка должна быть 10018. Пока не понимаю, что происходит.

Не удалось отправить торговый запрос. Потому, что рынок закрыт.  

 
Victor Ziborov:

Ренат, я эту функцию не держу в секрете. Может, она Вам не понравится, но она у меня работает надёжно. На вход поступают четырехзначные старые пункты, например, 90 пп. Эта функция переводит их в дробь: в 0.00900:

а так ошибка исчезнет?

if( Digits() == 5) Y = X*10.0*Point();

и тут бы я попробовал сразу:

double SL=70, TP=10;
 

Чтоб не плодить одинаковые темы, спрошу здесь.

При закрытии позиций на форексе, хеджинговый счёт сервер MetaQuotes-Demo, регулярно появляется    OrderSend error 4756.

deviation делал даже 10000, ошибка всё равно остаётся. Позиция может закрыться и с третьего и с четвёртого раза.

Код для закрытия такой:

void PositionClose(ENUM_POSITION_TYPE position_type)
  {
   ResetLastError();
   double sl=0, tp=0;
   int total = PositionsTotal(); // количество открытых позиций
//--- перебор всех открытых позиций
   for(int i = 0; i <= total; i++)
     {
      //--- параметры ордера
      ulong  position_ticket = PositionGetTicket(i);                                    // тикет позиции
      string position_symbol = PositionGetString(POSITION_SYMBOL);                      // символ
      ulong  magic = PositionGetInteger(POSITION_MAGIC);                                // MagicNumber позиции
      double volume = PositionGetDouble(POSITION_VOLUME);                               // объем позиции
      double _sl = PositionGetDouble(POSITION_SL);
      double _tp = PositionGetDouble(POSITION_TP);                             
      ENUM_POSITION_TYPE type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);  // тип позиции
      //--- если MagicNumber совпадает
      if(magic == Magic || Magic == 0)
        {
         if(position_symbol == _Symbol)
           {
            //--- обнуление значений запроса и результата
            ZeroMemory(request);
            ZeroMemory(result);
            //--- установка параметров операции
            request.action   = TRADE_ACTION_DEAL;       // тип торговой операции
            request.position = position_ticket;         // тикет позиции
            request.symbol   = position_symbol;         // символ
            request.volume   = volume;                  // объем позиции
            request.deviation = slippage;               // допустимое отклонение от цены
            request.magic    = Magic;                   // MagicNumber позиции
            request.sl          = _sl;
            request.tp          = _tp;
            //--- установка цены и типа ордера в зависимости от типа позиции
            if((type == POSITION_TYPE_BUY && position_type == POSITION_TYPE_BUY) || (type == POSITION_TYPE_BUY && position_type == 0))
              {
               request.price = NormalizePrice(SymbolInfoDouble(position_symbol, SYMBOL_BID));
               request.type = ORDER_TYPE_SELL;
              }
            else
               if((type == POSITION_TYPE_SELL && position_type == POSITION_TYPE_SELL) || (type == POSITION_TYPE_SELL && position_type == 0))
                 {
                  request.price = NormalizePrice(SymbolInfoDouble(position_symbol, SYMBOL_ASK));
                  request.type = ORDER_TYPE_BUY;
                 }
            if(!OrderSend(request, result))
               PrintFormat("OrderSend error %d", GetLastError()); // если отправить запрос не удалось, вывести код ошибки
           }
        }
     }
  }
//+------------------------------------------------------------------+

double NormalizePrice(const double price)
  {
   double tick_size = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_SIZE);
   if(tick_size != 0)
      return(NormalizeDouble(MathRound(price / tick_size) * tick_size, _Digits));
//---
   return(NormalizeDouble(price, _Digits));
  }




Пробовал использовать СБ , ошибка пропадает, но позиции всё равно не закрывает, программа просто пропускает их и закрывает не в цикле а только при повторных заходах в функцию закрытия сделок.

В чём может быть причина? Как избавится от этой ошибки?

 
Aleksandr Slavskii:

Чтоб не плодить одинаковые темы, спрошу здесь.

При закрытии позиций на форексе, хеджинговый счёт сервер MetaQuotes-Demo, регулярно появляется    OrderSend error 4756.

deviation делал даже 10000, ошибка всё равно остаётся. Позиция может закрыться и с третьего и с четвёртого раза.

Код для закрытия такой:




Пробовал использовать СБ , ошибка пропадает, но позиции всё равно не закрывает, программа просто пропускает их и закрывает не в цикле а только при повторных заходах в функцию закрытия сделок.

В чём может быть причина? Как избавится от этой ошибки?

Думаю это косяк MQL, я смог решить подобный вопрос заменой функции “for” на “while”