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

 
Aleksandr Slavskii:

В чём может быть причина?

В нестрогом неравенстве.

Как избавится от этой ошибки?

Сделать неравенство строгим.

 
Aleksandr Slavskii:

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

При закрытии позиций на форексе, хеджинговый счёт сервер 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);       

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

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

1. Начните с этого места - направление перебора.

2. Добавьте вывод код торгового сервера

И все вопросы отпадут

 
Странно что вы, с вашим опытом отвечаете на вопрос годовалой давности…
 
Alexey Viktorov:
Странно что вы, с вашим опытом отвечаете на вопрос годовалой давности…

На год не посмотрел. Что странного

 
Rashid Umarov:

1. Начните с этого места - направление перебора.

2. Добавьте вывод код торгового сервера

И все вопросы отпадут

for(int i = 0; i < total; i++)
 

Denis Sartakov:


for(int i = 0; i < total; i++)


Вообще говоря, правильно в обратном направлении. Это азбука работы с ордерами и позициями при закрытии и удалении

 

Для себя нашел решение такое:

   MqlTradeRequest request = {};
   MqlTradeResult result = {};

При обработке события OnTradeTransaction я меняю SL у позиции. Я обнаружил, что при объявлении переменной request без пустых значений, она содержала мусор во всех полях. Т.к. заполняются только 5 полей, возможно остальной мусор как-то влияет на обработку структуры запроса сервером. 

 

Всем спасибо за ответы.

Я когда задавал вопрос, ещё не знал, что тему можно добавить в избранное)))


Моё решение этой проблемы на данный момент - это закрывать с помощью цикла в цикле.

#include <Trade\Trade.mqh>
CTrade         m_trade;
//+------------------------------------------------------------------+
void OnStart()
  {
   while(PositionsTotal() > 0 && !IsStopped())
      for(int i = PositionsTotal() - 1; i >= 0; i--)
         m_trade.PositionClose(PositionGetTicket(i));
  }
//+------------------------------------------------------------------+
 
Aleksandr Slavskii #:

Всем спасибо за ответы.

Я когда задавал вопрос, ещё не знал, что тему можно добавить в избранное)))


Моё решение этой проблемы на данный момент - это закрывать с помощью цикла в цикле.

Есть одна проблема:

Приходит тик - сигнал на закрытие позиции, но в этот момент "Рынок закрыт".

Функция начинает долбить сервер.

Нужна обработка ситуации, чтобы выйти с функции.

 
Vitaly Muzichenko #:

Есть одна проблема:

Приходит тик - сигнал на закрытие позиции, но в этот момент "Рынок закрыт".

Функция начинает долбить сервер.

Нужна обработка ситуации, чтобы выйти с функции.

Конечно, вы совершенно правы, обработка нужна обязательно и конечно я её делаю, здесь показал упрощённый пример кода, саму суть.