Ручное закрытие ордеров в тестере - страница 2

 
peterlogin:

Вообще странно что тема закрытия ордеров в тестере редко поднимается.

На данный момент реализовал механизм по принципу предложенному  Ihor Herasko с линиями. Причем линии сделал невидимыми. 
Но есть существенный недостаток в алгоритме. Т.к. кроме удаления самого ордера после удаления линии руками, приходиться проверять и удалять сами линии в случае закрытия ордера советником.

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

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

Говорю, же, есть готовые рецепты. Поищите просто.

https://www.mql5.com/ru/code/24829

TradePanel_Csharp
TradePanel_Csharp
  • www.mql5.com
Торговая панель, которая работает и в Визуализаторе Тестера.Таблица текущих ордеров/позиций.Таблица истории торгов (корректно работает на Хедж-счетах). Использование Ручная торговля в Тестере или вмешивание в работу советника (например, с целью проверки устойчивости ко внешним факторам).Ручная торговля в Терминале на демо/реальных...
 
Aleksey Mavrin:

Блин, который раз слышу такое очевидное заблуждение что что-то надо делать на каждом тике, зачем?! :)

Удаление линии - событие OnChartEvent, в нем удаление ордера.

Удаление ордера - если МТ5 OnTrade или если нужно OnTradeTransaction. В МТ4 советник при удалении пусть выставляет флаг, который всего лишь и проверять на тике тогда уж.

З.Ы. Когда искал что-то интересующее в кодо-базе столкнулся с тем, что по ощущениям минимум 80% там лежит программ, выполняющих 80% бесполезных действий, таких как пересчёт всей истории индикатора на каждом тике) возможно ошибаюсь и мне просто не повезло.

какое событие сработает (MT4) при закрытии ордера самим советником?

 
peterlogin:

какое событие сработает (MT4) при закрытии ордера самим советником?

в МТ4 нет OnTrade, возможно пока. Цитирую:

В МТ4 советник при удалении ордера пусть выставляет флаг, который всего лишь и проверять на тике тогда уж.

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

 
Aleksey Mavrin:

в МТ4 нет OnTrade, возможно пока. Цитирую:

В МТ4 советник при удалении ордера пусть выставляет флаг, который всего лишь и проверять на тике тогда уж.

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

при удалении ордера руками все понятно, речь идет про удаление ордера в процессе работы советника - т.е. когда ордер удаляется самим советником (допустим по достижению тейка)

 
peterlogin:

при удалении ордера руками все понятно, речь идет про удаление ордера в процессе работы советника - т.е. когда ордер удаляется самим советником (допустим по достижению тейка)

Так я и говорю не про удаление руками. Если советник удаляет ордер, значит он может и выставить флаг (булева переменная которую потом проверять) для удаления линии.

Я вообще делал класс обертку для связки линия-ордер-позиция. Советник при удалении ордера или позиции идет и меняет линию, например цвет, стиль, можно и удалить совсем. что непонятного?

Ап: А если вы выставляете Тейк не виртуальный, тогда позиция закрывается на сервере без участия советника как бы. В этом случае решение - хранить тейк для каждой линии и проверять достижение бидом или аском тейка линии, ок?

Удобно использовать из стандартной бибилиотека класс CChartTrendLines  или типа  того ;)

 
Aleksey Mavrin:

Так я и говорю не про удаление руками. Если советник удаляет ордер, значит он может и выставить флаг (булева переменная которую потом проверять) для удаления линии.

Я вообще делал класс обертку для связки линия-ордер-позиция. Советник при удалении ордера или позиции идет и меняет линию, например цвет, стиль, можно и удалить совсем. что непонятного?

 Не понятно почему вы не читаете что вам пишут. Ордер может закрыться по тейкпрофиту, как вы установите флаг?

 
peterlogin:

 Не понятно почему вы не читаете что вам пишут. Ордер может закрыться по тейкпрофиту, как вы установите флаг?

Вы неверно пишите от этого и непонятно. если установите тейк, то ордер закрывает не советник.

Ап: А если вы выставляете Тейк не виртуальный, тогда позиция закрывается на сервере без участия советника как бы. В этом случае решение - хранить тейк для каждой линии и проверять достижение бидом или аском тейка линии, ок?

Удобно использовать из стандартной бибилиотека класс CChartTrendLines  или типа  того ;)

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

Если быть точным ChartObjectsLines.mqh 

 

вот набросал код, должен работать - это кнопка и закрытие всех ордеров

#property copyright "Copyright 2019, IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict

#include <Controls\Button.mqh>
CButton Button;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   Button.Create(0,"ButtonCloseALL",0,10,10,80,40);
   Button.Text("Close All");
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(Button.Pressed())
   {
      for(int i=OrdersTotal()-1;i>=0;i--)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
            int ot = OrderType();
            bool res;
            if(ot<2) res=OrderClose(OrderTicket(),OrderLots(),ot == OP_BUY ? Bid : Ask ,30); else res = OrderDelete(OrderTicket());
         }
      }
      Button.Pressed(false);
   }
  }
//+------------------------------------------------------------------+
 
Aleksey Mavrin:

Блин, который раз слышу такое очевидное заблуждение что что-то надо делать на каждом тике, зачем?! :)

это не заблуждение

с момента прихода прошлого тика может много, что измениться, может ордер закрыться по тейку/стопу, может пользователь "помогает советнику"

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


тестировать производительность устал уже, но точно знаю, что комбинации OrdersTotal() --> OrderSelect(i,SELECT_BY_POS,MODE_TRADES) 

выполняются очень быстро, видел, да и сам иногда так писал коды советников в которых на одном тике по раза 3-5 пересчет ордеров был, ничего не тупит ни в тестере/оптимизаторе да и на реале нагрузка на процессор вообще отсутствует


т.е. OrdersTotal() --> OrderSelect(i,SELECT_BY_POS,MODE_TRADES)   пишите и вызывайте каждый тик, секреты производительности не в них, а сделать надежный код это Вам позволит 

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