вопросы о советнике который должен имитировать ручную торговлю в конкурсах - страница 2

 
ilqar200 #:
Если я буду использовать функцию IsConnected то брокер может узнать что я использую советник ?

IsConnected() не относится к торговым, т. е. не отправляет никаких запросов на сервер. По проверке соединения советую поискать здесь темы. Было время, когда этот вопрос тут активно обсуждался.

 
Возник еще немаловажный вопрос . Мне надо отловить закрытие окна Ордер чтобы открыть новый окно Ордер или модифицировать сушествуюший.В голову приходить только функция Sleep.Но это не решение. Нужно открыть новый окно ордер или  модифицировать сушествуюший ТОЛЬКО после закрытие предыдущего окна Ордер . Так как советник будет открывать немалое количество ордеров нужно постоянно следить за окном Ордер. Handle окна ордера я получаю. Если ордер не открывается по каким-либо причинам то надо узнать причину и постараться решить проблему тоже с помощью советника. Но это уже другой вопрос. Сейчас мне нужно постоянно следить за окном Ордер. Как это сделать ?
 
ilqar200 #:
Возник еще немаловажный вопрос . Мне надо отловить закрытие окна Ордер чтобы открыть новый окно Ордер или модифицировать сушествуюший.В голову приходить только функция Sleep.Но это не решение. Нужно открыть новый окно ордер или  модифицировать сушествуюший ТОЛЬКО после закрытие предыдущего окна Ордер . Так как советник будет открывать немалое количество ордеров нужно постоянно следить за окном Ордер. Handle окна ордера я получаю. Если ордер не открывается по каким-либо причинам то надо узнать причину и постараться решить проблему тоже с помощью советника. Но это уже другой вопрос. Сейчас мне нужно постоянно следить за окном Ордер. Как это сделать ?

Есть Win API функция IsWindowVisible().

 
Ihor Herasko #:

Есть Win API функция IsWindowVisible().

Я в курсе об этой функции.Я использую так если orderwindowhandle==0 значить окно ордера закрылась или не открыть окно Ордер на текущий момент.Проблема в том что я не знаю как постоянно следить за закрытием окна Ордер в течении всего времени. Вот это нужно мне.
 
ilqar200 #:
Я в курсе об этой функции.Я использую так если orderwindowhandle==0 значить окно ордера закрылась или не открыть окно Ордер на текущий момент.Проблема в том что я не знаю как постоянно следить за закрытием окна Ордер в течении всего времени. Вот это нужно мне.

Таймер... А в нем такое:

if (::IsWindow(hWnd) && ::IsWindowVisible(hWnd))
{
   // окно существует и видимо
}
 
Я не понял как использовать таймер в моем случае.Объясните пожалуйста новичку .У меня на данный момент проблема следующее: У меня есть n-ое количество ордеров открытых или отложенных или открытых и отложенных вместо взятых.Не имеет разницы тип ордеров потому что у меня есть уже глобально объявленное функция клика на ордере на нужном месте syslistview с параметром порядкого номера ордера на syslistview.Пока функция клика работает только на открытых ордерах но я могу дописать эту функцию чтобы сработал клик и на отложенных ордерах тоже.Как можно модифицировать эти n-ое количество ордеров поочередно дожидаяс закрытие окно Ордер ? Если не дождаться закрытие окно Ордер то клик не сработает на следуюшем ордере. Обязательно нужно дождаться закрытие окно Ордер по другим прицинам тоже ну например связь с сервером может обарваться в момент отправки запроса . Ну исправить эту ситуацию или другие ситуации  вызвавшие НЕ закрытие окно ордера можно программно исправить я думаю.Но это уже другая проблема.  Напоминаю работать с окном Ордер я могу т.е закрыть ордер по клику на кнопке,модифицироват поля тейк и стоп тоже могу и хендл этого окно тоже получаю. Мне в голову пришло исползовать цикл for но не получил я желаемого резултата или я не правильно написал код внутри цикла. Как программно ждать закрытие окно Ордер внутри цикла после 1-ой,2-ой,n-ой итерации т.е нужно сделать 1-ую итерации ждать событие после событие 2-ое итерация ждать событие и т.д. Как реализовать такие действие в коде ? Заранее спасибо за помощ.
 
ilqar200 #:
Я не понял как использовать таймер в моем случае.Объясните пожалуйста новичку .

Если в MQL, то так:

#import "user32.dll"
   int      IsWindowVisible(int hWnd);
   int      IsWindow(int hWnd);
#import

int OnInit() 
{
   EventSetMillisecondTimer(100);
   return(INIT_SUCCEEDED);
}

void OnTimer()
{
   bool bIsOrderWindowVisible = (IsWindow(m_hOrderWnd) && IsWindowVisible(m_hOrderWnd));   
   if (!bIsOrderWindowVisible)
   {
      // разрешить клик в SysListView
   }
}

В MFC практически аналогично. 

Объясните пожалуйста новичку
Да Вы терминал по косточкам разбираете )) Какой уж тут новичок?
 
Ваш код это но то что мне нужно. Если исползовать мою функцию клика на ордере в этом OnTimer()-е  то он откроет мне только одного ордера. А мне нужно чтобы кликнул на все открытые ордера . Уже в этом случае нужен цикл. Но как написать цикл чтобы происходило вот так : клик на 1-ом ордере - ждать закрытие окна Ордер - клик на 2-ом ордере-ждать закрытие окна Ордер - и т.д. Нужно ЖДАТЬ определенного события внутри цикла после каждой итерации в моем случае закрытие окно . Как это действие написать ?
 
ilqar200 #:
Ваш код это но то что мне нужно. Если исползовать мою функцию клика на ордере в этом OnTimer()-е  то он откроет мне только одного ордера. А мне нужно чтобы кликнул на все открытые ордера . Уже в этом случае нужен цикл. Но как написать цикл чтобы происходило вот так : клик на 1-ом ордере - ждать закрытие окна Ордер - клик на 2-ом ордере-ждать закрытие окна Ордер - и т.д. Нужно ЖДАТЬ определенного события внутри цикла после каждой итерации в моем случае закрытие окно . Как это действие написать ?

То, что самое первое в голову пришло:

int g_nOrderIndex = -1;
void OnTimer()
{
   int nTotal = OrdersTotal();
   if (g_nOrderIndex >= nTotal)
   {
      g_nOrderIndex = -1;
      return;
   }

   if (IsWindow(m_hOrderWnd) && IsWindowVisible(m_hOrderWnd))
      return;

   ++g_nOrderIndex;
   if (!OrderSelect(g_nOrderIndex, SELECT_BY_POS))
      return;

   // Клик в строке ордера с индексом g_nOrderIndex
}

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

 
Этот код тоже действует не так как мне нужно. Если EventSetTimer сделать с интервалом 5 секунд то этот код будет равносилен моему коду в котором есть цикл for и Sleep интервалом 5 секунд.В моем коде как и в вашем клик на ордерах ЗАВИСЕТЬ ОТ ИНТЕРВАЛА ВРЕМЕНИ который мы выставляем.Как я писал выше  это не решение. Нужно сделать клик на ордере ПО ФАКТУ ЗАКРЫТИЕ предыдущего окна Ордер.Какой бы интервал клика мы не выставили этого интервала может не хватить для клика на ордере или этот интервал будет большим и советник будет попросту ждать вместо того чтобы сделать другие действие. Понимаете нужно кликать по ФАКТУ ЗАКРЫТИЕ ОКНО а не по времени. Нужно запрограммировать такое действие как я выше писал : клик на 1-ом ордере ЖДАТЬ ЗАКРЫТИЕ ОКНО ПОСЛЕ ЗАКРЫТИЕ клик на 2-ом ордере ЖДАТЬ ЗАКРЫТИЕ ОКНО ПОСЛЕ ЗАКРЫТИЕ клик на 3-им ордере и т.д. Таймер помогает лучше справляться с отловом состояние нет связи . Здесь уже интервал времени не мешает отловке состояние нет связи.Ну например выставили 1 секунд и таймер ежесекундно будет следить за появлением сообшение нет связи и если это сообшение есть то  попробует заново отправить запрос в окне Ордер. Ну я не поверю что нету такого кода чтобы состание ожидание невозможно было бы запрограммировать в цикле.Вот как ждать в цикле ? вопрос трудный для меня.