Лимитки в 2 стороны - страница 2

 
Fresto:

Я всё пытаюсь вывести это в журнал из библиотеки AccountInfo) Сложно разбираться с mql5.

Неттинговый тип торгового счет. Тогда получается с помощью вашей функции события при наступлении Buy или Sell я удаляю отложенный ордер на противоположную позицию. Сейчас попробую.
 
Fresto:

Я всё пытаюсь вывести это в журнал из библиотеки AccountInfo) Сложно разбираться с mql5.


В данном случае нужно просто навести мышку на название торгового счёта или посмотреть вверх терминала:

Тип счёта

 
Vladimir Karputov:


В данном случае нужно просто навести мышку на название торгового счёта или посмотреть вверх терминала:



Там это не написано. Выводил через ACCOUNT_TRADE_MODE. 
 
Fresto:

Там это не написано. Выводил через ACCOUNT_TRADE_MODE. 

Если не написано - значит неттинг.
 
Итак, всё я написал, по дебаггингу он заходит в данную функцию и при открытие позиции Buy выполняет функцию OrderDelete. Но в итоге на графике ничего не меняется. И на счет того, что ордера не срабатывают по своим позициям.
Почему он выставляет по одной цене, а продает по-другой.
 
Fresto:
*** Но в итоге на графике ничего не меняется.***

? Как это не меняется? Если позиция открывается - то на графике будет значок открытия позиции.

 Fresto:
*** И на счет того, что ордера не срабатывают по своим позициям.
Почему он выставляет по одной цене, а продает по-другой.

А теперь более подробно:

  • какой режим генерации тиков
  • Вы разместили Buy Limit по 109610 - у Вас сработал BuyLimit и получилась позиция Buy по 109610 - здесь всё правильно
  • Вы разместили SellLimit по 109570 - у Вас сработал SellLimit по 109570- здесь всё правильно
  • а дальше смотрите внимательно: у Вас уже была открыта позиция Buy и тут у Вас срабатывает Sell LImit - то есть открывается ПРОТИВОПОЛОЖНАЯ позиция. В итоге позиция BUY закрывается позицией SELL. Позиция BUY у нас закрывается по цене BID - вот 109600 это как раз и есть цена BID для позиции BUY.
Итог: всё правильно, а вот Вы после срабатывания отложенного ордера просто не успеваете удалить противоположный отложенный ордер.

 
Vladimir Karputov:

? Как это не меняется? Если позиция открывается - то на графике будет значок открытия позиции.

А теперь более подробно:

  • какой режим генерации тиков
  • Вы разместили Buy Limit по 109610 - у Вас сработал BuyLimit и получилась позиция Buy по 109610 - здесь всё правильно
  • Вы разместили SellLimit по 109570 - у Вас сработал SellLimit по 109570- здесь всё правильно
  • а дальше смотрите внимательно: у Вас уже была открыта позиция Buy и тут у Вас срабатывает Sell LImit - то есть открывается ПРОТИВОПОЛОЖНАЯ позиция. В итоге позиция BUY закрывается позицией SELL. Позиция BUY у нас закрывается по цене BID - вот 109600 это как раз и есть цена BID для позиции BUY.
Итог: всё правильно, а вот Вы после срабатывания отложенного ордера просто не успеваете удалить противоположный отложенный ордер.


Я вас понял. Но как программа не успевает удалить противоположный отложенный ордер, если я вызываю функцию удаления сразу после срабатывания первого отложенного ордера?

void OnTradeTransaction(const MqlTradeTransaction &trans,
                                  const MqlTradeRequest &request,
                                  const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value 
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_entry        =0;
      long     deal_type         =0;
      string   deal_symbol       ="";
      long     deal_magic        =0;
      if(HistoryDealSelect(trans.deal))
        {
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
        }
      else
         return;
      if(deal_symbol==Symbol())
         if(deal_entry==DEAL_ENTRY_IN)
           {
            //--- если словили открытие BUY
            if(deal_type==DEAL_TYPE_BUY)
              {
                  mytrade.OrderDelete(SellTicket);
              }
            //--- если словили открытие SELL
            if(deal_type==DEAL_TYPE_SELL)
              {
                  mytrade.OrderDelete(BuyTicket);
              }
           }
     }
  }
 
В итоге, из журнала видно, что сначала исполняются 2 ордера, и потом только программа через OnTradeTransac пытается удалить якобы выставленный отложенный ордер
 
Fresto:
В итоге, из журнала видно, что сначала исполняются 2 ордера, и потом только программа через OnTradeTransac пытается удалить якобы выставленный отложенный ордер

И‌з журнала видно, что все происходит в одно мгновение.

Вы пытаетесь торговать в 10-00 - вероятно это время открытия дневных торгов, а значит очень стакан пустой и будут огромные скачки цен.. Пройдите в тестере в режиме "Каждый тик на основе реальных тиков" в пошаговом режиме и просмотрите, как в этот момент изменяются котировки.

 
Vladimir Karputov:

И‌з журнала видно, что все происходит в одно мгновение.

Вы пытаетесь торговать в 10-00 - вероятно это время открытия дневных торгов, а значит очень стакан пустой и будут огромные скачки цен.. Пройдите в тестере в режиме "Каждый тик на основе реальных тиков" в пошаговом режиме и просмотрите, как в этот момент изменяются котировки.


Вот теперь всё заработало так, как я и хотел. Не зная этих тонкостей, когда нужно просто поменять режим в тестере и всё получится, нервов потратишь много. Спасибо большое за помощь и за функцию от OnTradeTrandsac.
Причина обращения: