Почему выдается результат: "Код возврата торгового сервера: 0" ?
Показано с 1 по 9 из 9

Тема: Почему выдается результат: "Код возврата торгового сервера: 0" ?

  1. #1
    Новичок Аватар для Mike_Kharkov
    Регистрация
    08.07.2014
    Сообщений
    103
    Promo (¢)
    1,685
    Благодарности
    Получено: 8
    Отправлено: 126

    Почему выдается результат: "Код возврата торгового сервера: 0" ?

    Добрый день.
    С программированием на MQL(MQL5) впервые столкнулся около недели назад.
    (в общем пока что мало чего знаю в этой области.)

    Есть такой код:

    Код:
    //+------------------------------------------------------------------+
    //|                                                  My_Practics.mq5 |
    //|                                                     Mike_Kharkov |
    //|                                https://www.fl.ru/users/Yamaradg/ |
    //+------------------------------------------------------------------+
    #property copyright "Mike_Kharkov"
    #property link      "https://www.fl.ru/users/Yamaradg/"
    #property version   "1.00"
    //+------------------------------------------------------------------+
    //| Expert initialization function                                   |
    //+------------------------------------------------------------------+
    int OnInit()
      {
    
      
      /*
      Print(" Тикет сделки:" , result.deal);
      Print(" Ордер: ", result.order);
      Print(" Обьём: " , result.volume);
      Print(" Цена в сделке, подтверждённая брокером: " , result.price);
      Print(" Текущая рыночная цена предложения (цены реквоты): " , result.bid);
      Print(" Текущая рыночная цена спроса (цены реквоты): " , result.ask);
      Print(" Комментарий брокера к операции (по умолчанию заполняется расшифровкой: " , result.comment);
      Print(" Идентификатор запроса, проставляемый терминалом при отсылке на торговый сервер: " , result.request_id);
      */
    
    //---
       
    //---
       return(INIT_SUCCEEDED);
      };
    //+------------------------------------------------------------------+
    //| Expert deinitialization function                                 |
    //+------------------------------------------------------------------+
    void OnDeinit(const int reason)
      {
    //---
      };
    //+------------------------------------------------------------------+
    //| Expert tick function                                             |
    //+------------------------------------------------------------------+
    void OnTick()
      {
       
      MqlTradeRequest request={0};
      
      request.action = TRADE_ACTION_DEAL;                                        // Тип выполняемого действия
      request.symbol = _Symbol;                                                  // Имя торгового инструмента
      request.volume = 0.01;                                                     // Запрашиваемый объем сделки в лотах
      request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);                     // Цена  
      request.type = ORDER_TYPE_BUY;                                             // Тип ордера
      request.tp = 0;                                                            // Цена, по которой сработает Take Profit ордер при движении цены в благоприятном направлении
      request.sl = 0;                                                            // Цена, по которой сработает Stop Loss ордер при движении цены в неблагоприятном направлении
      request.type_filling = ORDER_FILLING_FOK;                                  // Тип ордера по исполнению
      request.type_time = ORDER_TIME_GTC;
                                        
      MqlTradeResult result={0};
      uint result_retcode = result.retcode;
      
      int positions_total = PositionsTotal();
      
      if(positions_total < 1)
         {
          bool send1 = OrderSend(request,result);
         };
         
      Print(" Код возврата торгового сервера: ", result_retcode);
      Print(" Количество открытых позиций: ", positions_total);
      
    //---
       
      };
    //+------------------------------------------------------------------+

    При проверке на истории выдается результат: "Код возврата торгового сервера: 0"
    3.jpg

    Не подскажите почему это может происходить?
    (1 сделка все таки совершилась на сколько я понимаю.
    По идее должен выдаваться код 10009.)

    Вы не можете благодарить!
    Последний раз редактировалось Mike_Kharkov; 26.07.2014 в 09:00.

  2. #2
    Теоретик
    Регистрация
    03.04.2013
    Сообщений
    475
    Promo (¢)
    690
    Благодарности
    Получено: 148
    Отправлено: 79
    Mike_Kharkov, строку uint result_retcode = result.retcode; ставь после OrderSend, а не перед, ибо в result до этого содержатся проинициализированная величина, т.е. везде по 0. Условие positions_total<1 и будет генерировать всё время открытие только одной сделки.

    Вы не можете благодарить!

  3. #3
    Новичок Аватар для Mike_Kharkov
    Регистрация
    08.07.2014
    Сообщений
    103
    Promo (¢)
    1,685
    Благодарности
    Получено: 8
    Отправлено: 126
    Цитата Сообщение от KLoAF Посмотреть сообщение
    Mike_Kharkov, строку uint result_retcode = result.retcode; ставь после OrderSend, а не перед, ибо в result до этого содержатся проинициализированная величина, т.е. везде по 0. Условие positions_total<1 и будет генерировать всё время открытие только одной сделки.

    Сделал вот так:

    Код:
    void OnTick()
      {
       
      MqlTradeRequest request={0};
      
      request.action = TRADE_ACTION_DEAL;                                        // Тип выполняемого действия
      request.symbol = _Symbol;                                                  // Имя торгового инструмента
      request.volume = 0.01;                                                     // Запрашиваемый объем сделки в лотах
      request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);                     // Цена  
      request.type = ORDER_TYPE_BUY;                                             // Тип ордера
      request.tp = 0;                                                            // Цена, по которой сработает Take Profit ордер при движении цены в благоприятном направлении
      request.sl = 0;                                                            // Цена, по которой сработает Stop Loss ордер при движении цены в неблагоприятном направлении
      request.type_filling = ORDER_FILLING_FOK;                                  // Тип ордера по исполнению
      request.type_time = ORDER_TIME_GTC;
                                        
      MqlTradeResult result={0};
      
      int positions_total = PositionsTotal();
      
      if(positions_total < 1)
         {
          bool send1 = OrderSend(request,result);
          uint result_retcode = result.retcode;
          Print(" Код возврата торгового сервера: ", result_retcode);
          Print(" Количество открытых позиций: ", positions_total);
         };
      
    //---
    И получилось вот что:
    4.jpg

    То есть теперь код возврата есть (10009)
    Но количество посдсчета позиций равняется нулю. )



    Если сделать вот так:

    Код:
    void OnTick()
      {
       
      MqlTradeRequest request={0};
      
      request.action = TRADE_ACTION_DEAL;                                        // Тип выполняемого действия
      request.symbol = _Symbol;                                                  // Имя торгового инструмента
      request.volume = 0.01;                                                     // Запрашиваемый объем сделки в лотах
      request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);                     // Цена  
      request.type = ORDER_TYPE_BUY;                                             // Тип ордера
      request.tp = 0;                                                            // Цена, по которой сработает Take Profit ордер при движении цены в благоприятном направлении
      request.sl = 0;                                                            // Цена, по которой сработает Stop Loss ордер при движении цены в неблагоприятном направлении
      request.type_filling = ORDER_FILLING_FOK;                                  // Тип ордера по исполнению
      request.type_time = ORDER_TIME_GTC;
                                        
      MqlTradeResult result={0};
      
      int positions_total = PositionsTotal();
      
      if(positions_total < 1)
         {
          bool send1 = OrderSend(request,result);
          uint result_retcode = result.retcode;
          Print(" Код возврата торгового сервера: ", result_retcode);
         };
         
      Print(" Количество открытых позиций: ", positions_total);
      
    //---
       
      };
    То получается вот что:
    5.jpg

    Тоесть кол-во позиций отображается при каждом тике
    Но кода возврата нет вообще на сколько я понимаю..

    P.S. Cобственно с этой дилеммой, и бьюсь уже больше суток. )

    Вы не можете благодарить!

  4. #4
    Теоретик
    Регистрация
    03.04.2013
    Сообщений
    475
    Promo (¢)
    690
    Благодарности
    Получено: 148
    Отправлено: 79
    Mike_Kharkov, а что именно хочешь сделать? Что в первом, что во втором случае программа делает логичные вещи.
    По поводу второго случая: при открытии ордера по-любому есть информация по коду возврата...Единственно, не всё может помещатся в журнал на терминале, тем более в случае, когда информации много. Сделай так: во вкладке журнал нажми правой кнопкой мыши - Открыть. В результате откроется список всех файлов логов. Выбираешь тот, который соответсвует текущей дате (в название записывается дата).

    Вы не можете благодарить!

  5. #5
    Новичок Аватар для Mike_Kharkov
    Регистрация
    08.07.2014
    Сообщений
    103
    Promo (¢)
    1,685
    Благодарности
    Получено: 8
    Отправлено: 126
    Цитата Сообщение от KLoAF Посмотреть сообщение
    Mike_Kharkov, а что именно хочешь сделать?
    В данном случае хочу просто добиться того, что бы и в одном и в другом принте выдавались результаты без ошибок.
    То есть что бы был показан результат:
    1) Код возврата: 10009
    2) Кол-во сделок: 1
    P.S. Я просто хочу понять, что именно делаю не так с точки зрения написания кода.
    (И как это фиксить в будущем.)



    Цитата Сообщение от KLoAF Посмотреть сообщение
    Сделай так: во вкладке журнал нажми правой кнопкой мыши - Открыть. В результате откроется список всех файлов логов. Выбираешь тот, который соответсвует текущей дате (в название записывается дата).
    А что это мне даст в итоге?
    (файл у меня там только один. + открывается очень долго и в общем вариант появляется его только в PDF вывести либо он просто закрывается.)
    6.jpg

    Вы не можете благодарить!
    Последний раз редактировалось Mike_Kharkov; 26.07.2014 в 11:16.

  6. #6
    Теоретик
    Регистрация
    03.04.2013
    Сообщений
    475
    Promo (¢)
    690
    Благодарности
    Получено: 148
    Отправлено: 79
    Mike_Kharkov, наиболее близок к этому первый вариант, НО! int positions_total = PositionsTotal(); Ты определил количество позиций. Если до этого ничего не открывалось, то понятное дело оно будет равно 0. Далее ты отправляешь ордер. Кол-во позиций изменилось, теперь оно равно 1, но значение в переменной ты не поменял, там по-прежнему 0. Надо так:
    PHP код:
    if(positions_total 1)
         {
          
    bool send1 OrderSend(request,result);
          
    uint result_retcode result.retcode;
          
    positions_total PositionsTotal();
          Print(
    " Код возврата торгового сервера: "result_retcode);
          Print(
    " Количество открытых позиций: "positions_total);
         }; 
    Плюс ко всему на MT5 позиция всегда 1, если сделки открываются по одному и тому же инструменту. Т.е. кол-во сделок через PositionsTotal(); не определишь. В этом плане MT4 пологичнее выглядит. На MT5 кол-во сделок тоже можно определить, но несколько сложнее...

    ---------- Сообщение добавлено в 11:18 ----------

    Цитата Сообщение от Mike_Kharkov Посмотреть сообщение
    А что это мне даст в итоге?
    Как вижу в самом начале retcode равен 10009, так что всё нормально.

    Вы не можете благодарить!

  7. #7
    Новичок Аватар для Mike_Kharkov
    Регистрация
    08.07.2014
    Сообщений
    103
    Promo (¢)
    1,685
    Благодарности
    Получено: 8
    Отправлено: 126
    Цитата Сообщение от KLoAF Посмотреть сообщение
    Mike_Kharkov, наиболее близок к этому первый вариант, НО! int positions_total = PositionsTotal(); Ты определил количество позиций. Если до этого ничего не открывалось, то понятное дело оно будет равно 0. Далее ты отправляешь ордер. Кол-во позиций изменилось, теперь оно равно 1, но значение в переменной ты не поменял, там по-прежнему 0. Надо так:
    PHP код:
    if(positions_total 1)
         {
          
    bool send1 OrderSend(request,result);
          
    uint result_retcode result.retcode;
          
    positions_total PositionsTotal();
          Print(
    " Код возврата торгового сервера: "result_retcode);
          Print(
    " Количество открытых позиций: "positions_total);
         }; 
    Плюс ко всему на MT5 позиция всегда 1, если сделки открываются по одному и тому же инструменту. Т.е. кол-во сделок через PositionsTotal(); не определишь. В этом плане MT4 пологичнее выглядит. На MT5 кол-во сделок тоже можно определить, но несколько сложнее...

    ---------- Сообщение добавлено в 11:18 ----------


    Как вижу в самом начале retcode равен 10009, так что всё нормально.
    А что можно придумать тогда, что бы допустим понять(при помощи запроса) - сколько раз я докупался или продавал(находясь в данной позиции) и исходя из этих условий мог задавать те или иные параметры уже потом?

    P.S. Ваш последний вариант работает.
    А где можно допустим(в доке) почитать о том, как во время каждого тика работает вся эта кухня?
    Я почему то раньше думал, что поскольку PositionsTotal(); с каждым тиком заново пересчитывается - то и значение переменной тоже пересчитыватся должно соответственно? )

    Вы не можете благодарить!
    Последний раз редактировалось Mike_Kharkov; 26.07.2014 в 11:41.

  8. #8
    Теоретик
    Регистрация
    03.04.2013
    Сообщений
    475
    Promo (¢)
    690
    Благодарности
    Получено: 148
    Отправлено: 79
    Mike_Kharkov, PositionsTotal() по идее меняется даже чаще, чем тик. Просто есть условие if(positions_total < 1), а оно выполнимо только когда нету сделок, но там находится Print.
    По поводу сделок можно так:
    PHP код:
    PositionSelect(Symbol());
    HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER));
    int total=HistoryDealsTotal();
    for (
    int i=0i<totali++)
        {
        
    int Ticket=(int)HistoryDealGetTicket(i); // к примеру находишь все тикеты
        
    long TypePosition=HistoryDealGetInteger(Ticket,DEAL_TYPE); // или тип
        

    ---------- Сообщение добавлено в 12:16 ----------

    Цитата Сообщение от Mike_Kharkov Посмотреть сообщение
    Я почему то раньше думал, что поскольку PositionsTotal(); с каждым тиком заново пересчитывается - то и значение переменной тоже пересчитыватся должно соответственно? )
    Вы ошибались, PositionsTotal() пересчитывается после каждого запроса, а вот значение переменной - это не функция, а просто число и программа не знает о том, что оно должно постоянно менятся...

    Вы не можете благодарить!

  9. #9
    Новичок Аватар для Mike_Kharkov
    Регистрация
    08.07.2014
    Сообщений
    103
    Promo (¢)
    1,685
    Благодарности
    Получено: 8
    Отправлено: 126
    Большое Спасибо.

    Вы не можете благодарить!

Похожие темы

  1. Конкурс "Пять причин, почему я с RoboForex"
    от RoboForex Administrator в разделе Форум в социальных сетях
    Ответов: 37
    Последнее сообщение: 17.01.2017, 23:11
  2. Ответов: 0
    Последнее сообщение: 31.12.2016, 08:40
  3. "Welcome Bonus 3.0" не предоставлен, аннулирован. Почему?
    от Daren в разделе Бездепозитный бонус Форекс
    Ответов: 12
    Последнее сообщение: 05.11.2015, 20:17
  4. Ответов: 6
    Последнее сообщение: 27.11.2014, 20:29
  5. Ответов: 0
    Последнее сообщение: 27.08.2013, 18:08

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •