Ошибки, баги, вопросы - страница 3197

 
Andrey Dik #:

1. пипец какое самомнение, даже не знаю, хорошо это или плохо в данном случае. но, попрошу не отвечать мне больше здесь по этой ошибки. можно мне дождаться ответа разработчиков, а? ну пожалуйста!!!

2. Вы наверное издеваетесь?! какой код бага нужен? извольте проверить свои утверждения на указанном брокере. подозреваю, что не поняли о чем вообще речь.

На форуме полно информации по этой теме. Отвечать не буду.

 
fxsaber #:

На форуме полно информации по этой теме. Отвечать не буду.

так никто и не просил у Вас ответа по этой ошибке! - вопрос был адресован разработчикам.

 
Andrey Dik #:

Вопрос 1. функцией PositionGetDouble () получаем значение, к примеру SL или TP позиции, получаем 0.0, что это будет означать, что SL или TP у позиции нет, или что получена ошибка при выполнении функции? - неизвестно.

Вопрос 2. у брокера Just2Trade при исполнении функции OrderSend () структура MqlTradeResult значение price (Цена в сделке, подтверждённая брокером) всегда возвращает 0.0, чья это ошибка, MT5 или брокера? - очевидно, что брокера, но не это самое интересное, а то, что в тестере эта функция заполняет структуру результата нормально. таким образом, советник, отлаженный и протестированный в тестере, не сможет нормально работать на счете брокера в некоторых случаях построения логики. причем если сразу же запросить цену позиции после выполнения функции  OrderSend () функцией  PositionGetDouble (), то получим 0.0 (см. Вопрос 1), но, подождав 1 секунду, запросив снова цену позиции функцией PositionGetDouble (), получим.... цену позиции!!!

Наверное нарвусь на грубость, т.к. не отношусь к разработчикам :) но всё же отвечу на Ваши вопросы. Разработчики если и отвечают - то не быстро, а я по этим граблям находился уже достаточно, опыт есть.

По вопросу номер 1 - в справке по PositionGetDouble(), указано

Функция возвращает запрошенное свойство открытой позиции, 
предварительно выбранной при помощи функции PositionGetSymbol или PositionSelect.

Соответственно, если предварительно был PositionSelect()==true, то PositionGetDouble() возвращает то, что есть в выбранной позиции, ошибки там быть уже не может.

Если  PositionSelect()==false или не делался -  PositionGetDouble() выполнять смысла нет - об этом и говорится в справке.

По вопросу номер - 2.

Тоже кусок из справки:

OrderSend
В случае успешной базовой проверки структур (проверка указателей) возвращается true - это не свидетельствует об успешном выполнении торговой операции. 
Для получения более подробного описания результата выполнения функции следует анализировать поля структуры result.

При отправке рыночного ордера (MqlTradeRequest.action=TRADE_ACTION_DEAL) 
успешный результат функции OrderSend() не означает, 
что ордер был выполнен (исполнены соответствующие сделки): true в этом случае означает только то, 
что ордер был успешно размещен в торговой системе для дальнейшего выполнения. 
Торговый сервер может в возвращаемой структуре результата result заполнить значения полей deal или order, 
если эти данные будут ему известны в момент формирования ответа на вызов OrderSend(). 
В общем случае событие или события исполнения сделок, соответствующих ордеру, могут произойти уже после того, 
как будет отправлен ответ на вызов OrderSend(). 

То, что важно подчеркнул - в тестере исполнение мгновенное - и там всё заполняется сразу.

А в реальности - если запросить после OrderSend() сразу PositionSelect(), то она, как правило, вернет false. И цена сделки 0 в структуре по той же причине - её ещё не было.

А через секунду PositionSelect() уже вернет true - и можно будет делать PositionGetDouble().

Решается или через OnTrade или OnTradeTransaction или через таймер - тут зависит уже от фантазии программиста.


Зря Вы на fxsaber ругаетесь - видится, что он Вам искренне помочь хотел.

Это сообщение написано не ради спора/ругани, а просто из желания сэкономить вам время - повторюсь, сам потратил его много на понимание логики.

 
Andrey Miguzov #:

Наверное нарвусь на грубость, т.к. не отношусь к разработчикам :) но всё же отвечу на Ваши вопросы. Разработчики если и отвечают - то не быстро, а я по этим граблям находился уже достаточно, опыт есть.

По вопросу номер 1 - в справке по PositionGetDouble(), указано

Соответственно, если предварительно был PositionSelect()==true, то PositionGetDouble() возвращает то, что есть в выбранной позиции, ошибки там быть уже не может.

Если  PositionSelect()==false или не делался -  PositionGetDouble() выполнять смысла нет - об этом и говорится в справке.

По вопросу номер - 2.

Тоже кусок из справки:

То, что важно подчеркнул - в тестере исполнение мгновенное - и там всё заполняется сразу.

А в реальности - если запросить после OrderSend() сразу PositionSelect(), то она, как правило, вернет false. И цена сделки 0 в структуре по той же причине - её ещё не было.

А через секунду PositionSelect() уже вернет true - и можно будет делать PositionGetDouble().

Решается или через OnTrade или OnTradeTransaction или через таймер - тут зависит уже от фантазии программиста.


Зря Вы на fxsaber ругаетесь - видится, что он Вам искренне помочь хотел.

Это сообщение написано не ради спора/ругани, а просто из желания сэкономить вам время - повторюсь, сам потратил его много на понимание логики.

о, наверное Вы уже проверили свои утверждения у брокера Just2Trade? ну нет же, так?

в том то и дело, что  PositionSelect()==true, но  PositionGetDouble() возвращает цену позиции 0.0, хотя позиция успешно уже открыта, о чем свидетельствует возвращённый структурой результата тикет сделки, однако цена в этой структуре возврата ровна 0.0. 

вместо поучений проведите простой эксперимент самостоятельно у брокера  Just2Trade.

подобное поведение у этого брокера наблюдается уже более 5 лет, но так и присутствует сейчас. это единственная контора, у которой проявляется данная ошибка - нулевая цена в структуре возврата при успешно исполненной сделке.

Зря Вы на fxsaber ругаетесь - видится, что он Вам искренне помочь хотел.

в данном случае не знаю что он хочет, но точно не помочь. заявлять, что знает платформу лучше разработчиков - высшая степень хамства и наглости.

 
Andrey Dik #:

в том то и дело, что  PositionSelect()==true, но  PositionGetDouble() возвращает цену позиции 0.0

Если это так - то это конечно конкретный баг. 

Открывать счет и проверять, простите, не буду - очень жалко время. 

Чем смог, как говорится... 

 
Andrey Miguzov #:

Если это так - то это конечно конкретный баг. 

Открывать счет и проверять, простите, не буду - очень жалко время. 

Чем смог, как говорится... 

ну так какого лешего Вы лезли тогда вместе с Сабером?

 
Andrey Miguzov #:

Если это так - то это конечно конкретный баг. 

Это не так.

void OnStart()
{
  if (PositionSelect(_Symbol))
    MessageBox("Close the position and try again!");
  else
  {
    MqlTradeRequest Request = {};
    MqlTradeResult Result[1];
    
    Request.action = TRADE_ACTION_DEAL;
    Request.symbol = _Symbol;
    Request.volume = 1;
  
    if (OrderSend(Request, Result[0]))
    {    
      while (!IsStopped() && !PositionSelectByTicket(Result[0].order))
        Sleep(0);
        
      Print(PositionGetDouble(POSITION_PRICE_OPEN));
    }
  
    ArrayPrint(Result);  
  }
}


Результат на Just2Trade.

2022.06.12 14:32:00.740 Test9 (LTC.jt,M1)       49.41
2022.06.12 14:32:00.740 Test9 (LTC.jt,M1)           [retcode]    [deal]   [order] [volume] [price] [bid] [ask]          [comment] [request_id] [retcode_external] [reserved]
2022.06.12 14:32:00.740 Test9 (LTC.jt,M1)       [0]     10009 216013875 219492631     1.00   49.41 49.37 49.41 "Request executed"           16                  0        ...
 
fxsaber #:

Это не так.


Результат на Just2Trade.

while (!IsStopped() && !PositionSelectByTicket(Result[0].order))

ага, очень смешно))

а что же не распечатали сразу цену сделки после выполнения OrderSend ()?

и, небось, деньги положили на счет реальный, что бы проверить?

 
Andrey Dik #:

ну так какого лешего Вы лезли тогда вместе с Сабером?

Не пойму - зачем так нервничать и набрасываться на добрых людей?
Крокодил не ловится, не растет кокос?
 
Nikolai Semko #:
Не пойму - зачем так нервничать и набрасываться на добрых людей?
Крокодил не ловиться, не растет кокос?
добрые люди не суют свой нос туда, куда их не просят. 
Причина обращения: