Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 799

 
Aleksey Vyazmikin:

Спасибо! А я искал и не нашел...

Тогда следующий вопрос, допустим шаг 25, то как организовать округление к числу кратному 25, может функция какая есть?

https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/csymbolinfo/csymbolinfonormalizeprice

Документация по MQL5: Стандартная библиотека / Торговые классы / CSymbolInfo / NormalizePrice
Документация по MQL5: Стандартная библиотека / Торговые классы / CSymbolInfo / NormalizePrice
  • www.mql5.com
Стандартная библиотека / Торговые классы / CSymbolInfo / NormalizePrice - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Спасибо, но я использую не стандартную торговую библиотеку.

 
Vladislav Andruschenko:
Нет кода, нет комментариев. 

Да, странно. Прикрепил файл, но не проверил. Виноват. Сейчас прикрепляю и код и выдержку из кода в котором тестер выдает строку с [Invalid stops]. В этом куске кода хочу понять как работает структура MqlTradeRequest  при модификации позиции. В моём случае при изменении стопа по SAR. Но избавится от сообщения тестера [Invalid stops] не могу. Инструмент RTS Splice.

//+------------------------------------------------------------------+
//| Модификация Stop Loss открытой позиции                           |
//+------------------------------------------------------------------+
//--- объявление запроса и результата
   MqlTradeRequest request;
   MqlTradeResult  result;

   int total=PositionsTotal(); // количество открытых позиций  
   Print("total = ",total," ");
//--- перебор всех открытых позиций
   for(int i=0; i<total; i++)
     {
      if(PositionSelect(_Symbol)==true) // есть открытая позиция
        {
         //--- параметры ордера
         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 позиции

         if(PositionSelect(position_symbol)) // если позицию удалось выделить, значит - позиция существует
           {
            //--- обнуление значений запроса и результата
            ZeroMemory(request);
            ZeroMemory(result);
            //--- установка параметров операции
            request.action = TRADE_ACTION_SLTP;   // тип торговой операции
            request.position = position_ticket;   // тикет позиции
            request.symbol = position_symbol;     // символ 
            request.sl= STP;                      // Stop Loss позиции
            request.tp = 0;                       // Take Profit позиции

            //--- отсылаем ордер
            int number=OrderSend(request,result);
            // анализируем код возврата торгового сервера
            if(result.retcode==10009 || result.retcode==10008) //Request is completed or order placed
              {
               Alert("Ордер Sell успешно помещен, тикет ордера # ",result.order," ");
              }
            else
              {
               Alert("Запрос на установку ордера Sell не выполнен - код ошибки:",GetLastError());
               return;
              }
           }
        }
     }
Файлы:
SAR_SAR.mq5  27 kb
 
DCodec:

Да, странно. Прикрепил файл, но не проверил. Виноват. Сейчас прикрепляю и код и выдержку из кода в котором тестер выдает строку с [Invalid stops]. В этом куске кода хочу понять как работает структура MqlTradeRequest  при модификации позиции. В моём случае при изменении стопа по SAR. Но избавится от сообщения тестера [Invalid stops] не могу. Инструмент RTS Splice.

Это, на первый взгляд, не тот кусок кода, где стоит искать ошибку. Здесь напрягает только трехкратный выбор одной и той же позиции. Избыточно.

У Вас ошибка в некорректных стопах, наверно, нужно начать поиск с места, где эти стопы рассчитываются.

 
DCodec:

Да, странно. Прикрепил файл, но не проверил. Виноват. Сейчас прикрепляю и код и выдержку из кода в котором тестер выдает строку с [Invalid stops]. В этом куске кода хочу понять как работает структура MqlTradeRequest  при модификации позиции. В моём случае при изменении стопа по SAR. Но избавится от сообщения тестера [Invalid stops] не могу. Инструмент RTS Splice.

Для полного понимания надо уточнить какой тип счёта hadge или netting

Разбор полёта при условии что тип счёта hadge

if(PositionSelect(_Symbol)==true) // есть открытая позиция

Выбрали позицию по символу, НО она может быть совсем не та которую мечтали увидеть...

ulong  position_ticket=PositionGetTicket(i);// тикет позиции

А вот теперь выбрали именно ту позицию которая нужна.

Функция возвращает тикет позиции по индексу в списке открытых позиций и автоматически выбирает эту позицию для дальнейшей работы с ней при помощи функций


Дальше ещё раз попытка выбрать нужную позицию

if(PositionSelect(position_symbol)) // если позицию удалось выделить, значит - позиция существует

И опять вероятность что выбрана не та позиция которая нужна очень велика

При независимом представлении позиций (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) по каждому символу одновременно может быть открыто несколько позиций. В этом случае, PositionSelect выберет позицию с наименьшим тикетом.


Чтобы проверить как поведёт себя функция OrderSend() в этом случае, надо сделать так и проверить, но лучше сделать как должно быть и если ошибка не пропала распечатать не только код ошибки, но и тикет позиции, цену позиции, цену новых стоп и тейк. Это минимум.

 
Alexey Viktorov:

Для полного понимания надо уточнить какой тип счёта hadge или netting

Спасибо за комментарии. Тип счета netting. Инструмент RTS Splice. В этом то и вся сложность? Одна позиция на одном символе. Выбирать можно хоть как, всё равно попадешь на эту позицию. Это же не отложенные ордера? Поэтому я ещё больше не понимаю - ЧТО НЕ ТАК??? Перепробовал все варианты.

 
DCodec:

Спасибо за комментарии. Тип счета netting. Инструмент RTS Splice. В этом то и вся сложность? Одна позиция на одном символе. Выбирать можно хоть как, всё равно попадешь на эту позицию. Это же не отложенные ордера? Поэтому я ещё больше не понимаю - ЧТО НЕ ТАК??? Перепробовал все варианты.

А на это ответа не будет?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Вопросы от начинающих MQL5 MT5 MetaTrader 5

Alexey Viktorov, 2017.11.22 09:29

Чтобы проверить как поведёт себя функция OrderSend() в этом случае, надо сделать так и проверить, но лучше сделать как должно быть и если ошибка не пропала распечатать не только код ошибки, но и тикет позиции, цену позиции, цену новых стоп и тейк. Это минимум.


 
DCodec:

Поэтому я ещё больше не понимаю - ЧТО НЕ ТАК??? Перепробовал все варианты.

Вставьте эту строку в место, где возникает ошибка

Print(ToString(request) + ToString(result));

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2017.02.25 16:27

Перевод в строку MqlTrade-структур
#define TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"

string ToString( const MqlTradeTransaction &Trans )
{
  return(TOSTRING(Trans.deal) + TOSTRING(Trans.order) + TOSTRING(Trans.symbol) +
         TOSTRING2(Trans.type) + TOSTRING2(Trans.order_type) + TOSTRING2(Trans.order_state) +
         TOSTRING2(Trans.deal_type) + TOSTRING2(Trans.time_type) +
         TOSTRING(Trans.time_expiration) + TOSTRING(Trans.price) + TOSTRING(Trans.price_trigger) +
         TOSTRING(Trans.price_sl) + TOSTRING(Trans.price_tp) + TOSTRING(Trans.volume) +
         TOSTRING(Trans.position) + TOSTRING(Trans.position_by));
}

string ToString( const MqlTradeRequest &Request )
{
  return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) +
         TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) +
         TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) +  TOSTRING(Request.tp) +
         TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) +
         TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) +
         TOSTRING(Request.position) + TOSTRING(Request.position_by));
}

string ToString( const MqlTradeResult &Result )
{
  return(TOSTRING(Result.retcode) + TOSTRING(Result.deal) + TOSTRING(Result.order) +
         TOSTRING(Result.volume) + TOSTRING(Result.price) + TOSTRING(Result.bid) +  
         TOSTRING(Result.ask) + TOSTRING(Result.comment) + TOSTRING(Result.request_id) +  
         TOSTRING(Result.retcode_external));
}

#undef TOSTRING
#undef TOSTRING2

 
fxsaber:

Вставьте эту строку в место, где возникает ошибка


Вставил. Вот результат тестера:

2017.11.22 18:22:51.127    2016.11.09 12:00:00   exchange buy 1.00 RTS Splice at 98080 sl: 94130 (98070 / 98080 / 98070)
2017.11.22 18:22:51.127    2016.11.09 12:00:00   deal #4 buy 1.00 RTS Splice at 98080 done (based on order #4)
2017.11.22 18:22:51.127    2016.11.09 12:00:00   deal performed [#4 buy 1.00 RTS Splice at 98080]
2017.11.22 18:22:51.127    2016.11.09 12:00:00   order performed buy 1.00 at 98080 [#4 buy 1.00 RTS Splice at 98080]
2017.11.22 18:22:53.561    2016.11.09 14:05:00   failed modify #4 buy 1.00 RTS Splice sl: 94130, tp: 0 -> sl: 94316, tp: 0 [Invalid stops]
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Request.action = TRADE_ACTION_SLTP (6)
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Request.magic = 0
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Request.order = 0
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Request.symbol = RTS Splice
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Request.volume = 0.0
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Request.price = 0.0
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Request.stoplimit = 0.0
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Request.sl = 94316.0
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Request.tp = 0.0
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Request.deviation = 0
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Request.type = ORDER_TYPE_BUY (0)
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Request.type_filling = ORDER_FILLING_FOK (0)
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Request.type_time = ORDER_TIME_GTC (0)
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Request.expiration = 1970.01.01 00:00:00
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Request.comment =
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Request.position = 4
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Request.position_by = 0
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Result.retcode = 10016
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Result.deal = 0
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Result.order = 0
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Result.volume = 0.0
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Result.price = 0.0
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Result.bid = 0.0
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Result.ask = 0.0
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Result.comment = Invalid stops
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Result.request_id = 0
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Result.retcode_external = 0
2017.11.22 18:22:53.576    2016.11.09 14:05:00   Alert: Ошибка модификации позиции по TP и SL код ошибки: 4756

 
DCodec:

Вставил. Вот результат тестера:

Сервер и режим тестера?

Причина обращения: