[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 374

 
Arles:
Подскажите, пожалуйста, как решить проблему: одинаковый советник висит на нескольких графиках, одновременно появляется сигнал на открытие ордера, например, на двух графиках. Однако нужно, чтоб второй ордер не открывался. В советнике есть проверка на открытый ордер, но это не помогает, т. к. видимо, пока первый советник открывает ордер, второй тоже посылает запрос на открытие. Есть какие-нибудь варианты решения? 
Не совсем понятно для каких целей используется несколько одинаковых советников на нескольких графиках. - Исходя из этого понимания было бы более логично, что-то посоветовать. Но, исходя из имеющейся информации, если нужно, чтобы торговал лишь один советник, можно второму запретить торговать либо в настройках (если таковые предусмотрены внутри советника), либо на вкладке "Общие" - Разрешить советнику торговать (снять галочку).
К слову сказать, все советники работают в одном терминале не параллельно, а последовательно. - Пока 1-ый не закончил работу, 2-ой не будет обрабатывать данные. Поэтому, если советник правильно написан, т.е. делает проверку на выставленный ордер, то второй уже учтет этот ордер. - Это раз. Но это произойдет лишь в том случае, если советники настроены на согласованную работу. Скажем - имеют одинаковый Магик и учет Мани-Менеджмента. Иначе, только отключением "лишних" советников. - Тогда зачем их ставить?...
 
Chiripaha:
 Не совсем понятно для каких целей используется несколько одинаковых советников на нескольких графиках.

Советник анализирует только ту пару, на которой висит. На какой паре раньше появился сигнал - там и открывается ордер. Но бывает, что на двух парах одновременно появляется сигнал. И открывается, как ни странно, 2 ордера, хотя в советнике проверка вообще на любой открытый ордер есть, и открывать второй он не должен. А нужно это для того, что денег мало на депозите.  

 

Пока 1-ый не закончил работу, 2-ой не будет обрабатывать данные.

Да, но когда 1-ый закончил работу и открыл ордер, то 2-ой, приступив к работе, какое-то непродолжительное время НЕ ВИДИТ, что ордер уже есть. Либо он приступает к работе раньше, чем ордер откроется.
--

И еще: когда 1-ый советник Sleep(1000) второй ждет или начинает работу?

 

Всем добрый день!

Закодировал следующую идею

Условие N1 ..Если  High[1]  превышает некий максимум X

 и при этом

Условие N2 .разница между High[1] и Low  первой из ближайших 150 свечей >= 150 п.

------------------------------------------------------------------

Действие  N1 . Удалить предыдущий ордер

Действие  N2 ..Выставить отложенник

Действие  N3. Присвоить переменным значения.

ПРОБЛЕМА. Не смотря на то,что отложенник должен выставляться только если  ордеров в рынке нет,или последний ордер выставлен не на текущем баре. if (ot==0 || last_order_bar>0) 

При выполнении  Условие N1 и Условие N2 выставляется одновременно НЕСКОЛЬКО отложенных ордеров.

Мне нужно,чтобы выставлялся только ОДИН отложенный ордер.

-----------------------------------------------

Значения  ot  и  last_order_bar  расчитываются выше вот в этом коде

                                                                                                                        
                                                                                                                
int last_order_bar = 0;                                                                                                                 
int ot = OrdersTotal();                                                                                                                 
                                                                                                                        
 if (ot>0) //если есть ордера в рынке                                                                                                                   
 {                                                                                                                      
   if (OrderSelect (ot-1,SELECT_BY_POS)) //выбрали последний ордер                                                                                                                      
      if ( OrderType ()==OP_SELLSTOP) //проверили тип
        last_order_bar = iBarShift (Symbol (),0,T ); //запомнили, на каком  баре открыт последний ордер (если он есть)                                                                                                                  
 }                                                                                                                      
if(High[1] > X )
 {
   
   for(int i=1;i<150;i++)
     {
      if((High[1]-Low[i])>=1500*Point)//
      break;         //
             {
     if (ot>0) 
         {
           bool R = OrderDelete(OrderTicket());  
         }
if(R==0)                      //если последний выставленный SELLSTOP удален
         {
if (ot==0 || last_order_bar>0)        
int Ticket=OrderSend(Symbol(),OP_SELLSTOP,0.1,iHigh( Symbol (), 0,1)-1500*Point,1,iHigh( Symbol (), 0,1),iHigh( Symbol (), 0,1)-1610*Point,"jfh",123 );//выставить новый SELLSTOP       
if (Ticket>0)                // если SELLSTOP выставлен
 N = (OrderTicket());        //запомнить в глобальную переменную N тикета данного SELLSTOP .
 T = Time [0];               //запомнить в глобальную переменную время выставления данного SELLSTOP
 X=iHigh( Symbol (), 0,1);   //запомнить в глобальную переменную High свечи N1 после которой был выставлен данный SELLSTOP
   
 }
 }
 }
 }
}
 }   
                        
return(0);
 
Arles:

Советник анализирует только ту пару, на которой висит. На какой паре раньше появился сигнал - там и открывается ордер. Но бывает, что на двух парах одновременно появляется сигнал. И открывается, как ни странно, 2 ордера, хотя в советнике проверка вообще на любой открытый ордер есть, и открывать второй он не должен. А нужно это для того, что денег мало на депозите.  

 Да, но когда 1-ый закончил работу и открыл ордер, то 2-ой, приступив к работе, какое-то непродолжительное время НЕ ВИДИТ, что ордер уже есть. Либо он приступает к работе раньше, чем ордер откроется.
--

И еще: когда 1-ый советник Sleep(1000) второй ждет или начинает работу?

По первому вопросу:  я оговаривался, что, если правильно советники написаны... Разумеется, может получиться и так, как Вы описали, если нету проверки в советнике на выставленный (открытый) ордер, да еще и на учет этих ордеров, расчет Мани-Менеджмента - это уже от уровня (и лени) программиста зависит - продумал он эти дела и прописал в советнике или нет. Если все правильно реализовано, то ничего из Ваших опасений не произойдет. - Сигнал - да, может появиться на 2-х парах одновременно, но (читайте предыдущий пост), советники работают последовательно. Поэтому, пока первый советник не обработал котировки, следующий к работе не приступит. - Думаю, что именно по этой причине, чтобы избежать задвоений, сохранен принцип последовательности (даже, если бы и была возможность параллельной обработки - тут отдельная тема для дискуссий).

Также зависит от уровня советника. Т.к. все то, о чем Вы спросили, довольно муторно прописывать - очень не маленькая работа, требующая знания финансов. Поэтому советники, как правило, "простые", и ориентированы на то, что им отдается весь счет по текущей валюте. Обычно торгуется одна валюта. Потому что, чтобы торговать, к примеру, несколькими валютами, нужно депозит иметь совсем другого порядка и там уже такие простые системы не актуальны. Исключение из этого, пожалуй, будут лишь операции (забыл точный термин, выражусь иначе) хеджирования, когда открывается по одной цене на одной паре и тут же переоткрываются по другой (или даже нескольким) - разница себе. Но это другой тип советника и там будет все учтено (все в одном). - И вообще, на мой взгляд, если денег не больше ликвидности на паре, то торговать сразу по всем парам - это плохой тон. (но это мое частное мнение) Портфели и т.п. - это все нужно не для спекулятивной торговли. Почему-то люди этого совсем не учитывают. - Если Вы не производящая или не торгующая на международном рынке фирма, то Вам множество валют вообще не нужно. - Это я к тому - почему, как правило, не реализуют подобные блоки для учета по разным валютам в советниках - за неактуальностью.

А по второму вопросу:   честно говоря, у меня у самого этот вопрос открытый - я пока сам не до конца уверен как реагирует терминал при функции Sleep(1000).  - Тоже обращаюсь к знающим - подсказать ответ. По идее, терминал в этот момент будет обрабатывать лишь поточные цены - т.е. принимать котировки, рисовать графики и индикаторы. Но пока этот советник "ждет", то никому другому он свою очередь не передаст. - Но это мое предположение, в чем я как раз и не уверен. Возможно, исключением из этой "очереди" являются еще скрипты, которые в момент ожидания советника, могут быть запущены на исполнение. - Тоже вопрос и у меня.

Но - из этого незнания я выхожу тем, что строю работу своих советников исходя из корректности написания по-первому пункту.

 
solnce600:

Всем добрый день!

Закодировал следующую идею

Условие N1 ..Если  High[1]  превышает некий максимум X

 и при этом

Условие N2 .разница между High[1] и Low  первой из ближайших 150 свечей >= 150 п.

------------------------------------------------------------------

Действие  N1 . Удалить предыдущий ордер

Действие  N2 ..Выставить отложенник

Действие  N3. Присвоить переменным значения.

ПРОБЛЕМА. Не смотря на то,что отложенник должен выставляться только если  ордеров в рынке нет,или последний ордер выставлен не на текущем баре. if (ot==0 || last_order_bar>0) 

При выполнении  Условие N1 и Условие N2 выставляется одновременно НЕСКОЛЬКО отложенных ордеров.

Мне нужно,чтобы выставлялся только ОДИН отложенный ордер.

: )) Андрей, Вы задаете те вопросы, которые в учебнике просто разжеваны. Посмотрите в учебнике пример "Терминал" - в нем детально описаны принципы и логика того, как нужно вести учет ордеров. - Тогда большинство вопросов у Вас отпадут сами собой. И вообще, учебник построен на том, что полностью в виде примера представляется структура ЛЮБОГО грамотного советника. - В этом его и прелесть. + даются базовые теоретические понятия по программированию. Но в нем есть один ребус - он рассчитан на не ленивого читателя - это следует из структуры написанного. Т.е. чтобы снять вопросы по частным моментам, нужно прочесть весь учебник.  А пересказывать его (учебник) мало кто согласиться.

Вы строите нагромождения по учету ордеров. - Нужно проще подходить. Ордер либо есть, либо нету - и все равно на каком баре (при Ваших условиях) он открыт. - Из этих сложностей у Вас получается путаница с учетом ордеров и условий. - Отсюда алгоритмические ошибки, которые искать - задача любого программиста. Поменяйте логику написания программы - уйдут (сами собой) алгоритмические ошибки.

 
Ок.Спасибо.
 
Arles:

Советник анализирует только ту пару, на которой висит. На какой паре раньше появился сигнал - там и открывается ордер. Но бывает, что на двух парах одновременно появляется сигнал. И открывается, как ни странно, 2 ордера, хотя в советнике проверка вообще на любой открытый ордер есть, и открывать второй он не должен. А нужно это для того, что денег мало на депозите.  

 А всё элементарно просто! Первый советник у Вас открывает ордер. Если не важно какой совок открыл ордер.. то создадим условием в обоих. Создай булеву функцию, которая находит последний открытый ордер, и соответственно время его открытия извлеки. Если если это время открытия равно открытию текущего бара, то выходим с ТРУ из функции. Помести функцию в начало start'а и если режим ТРУ, то из start'а выходим, ну а если ФЭЛС, то эксперт работает как и нужно..
 
Chiripaha:

А по второму вопросу:   честно говоря, у меня у самого этот вопрос открытый - я пока сам не до конца уверен как реагирует терминал при функции Sleep(1000).  - Тоже обращаюсь к знающим - подсказать ответ. По идее, терминал в этот момент будет обрабатывать лишь поточные цены - т.е. принимать котировки, рисовать графики и индикаторы. Но пока этот советник "ждет", то никому другому он свою очередь не передаст. - Но это мое предположение, в чем я как раз и не уверен. Возможно, исключением из этой "очереди" являются еще скрипты, которые в момент ожидания советника, могут быть запущены на исполнение. - Тоже вопрос и у меня.

Но - из этого незнания я выхожу тем, что строю работу своих советников исходя из корректности написания по-первому пункту.



По ходу на сколько я понимаю, при отработки Sleep() эксперт просто засыпает т.е. его работа приостанавливается, и в данный момент эксперт ни получает котировки, ни реагирует вообще ни на что. И соответственно этот терминал передаст "очередь" другому..

 Если кто несогласен, просьба поправить меня! 

 
hoz:


По ходу на сколько я понимаю, при отработки Sleep() эксперт просто засыпает т.е. его работа приостанавливается, и в данный момент эксперт ни получает котировки, ни реагирует вообще ни на что. И соответственно этот терминал передаст "очередь" другому..

 Если кто несогласен, просьба поправить меня! 

Я не готов согласиться. - Потому что из такого положения теряется логика сохранения корректности работы и расчета советниками и денег и позиций. - Это раз. Второе. - Если у меня советник спит, к примеру, 100 миллисекунд, и в это время начинает работать другой, то, что же получится, что, как только пройдут эти 100 миллисекунд, то другой должен будет остановить свою работу... и передать на середине своей обратно этому и так бесконечно... С другой стороны. Я встречал (не редко) в советниках когда они на каждом блоке выполнения операций отправляют "спать" на минуты и по множеству раз. - Тогда, если в это время все остальные совы не работают, - тоже как-то неправильно. - Поэтому вопрос достаточно актуальный. Хотелось бы понимать логику работы в этот момент. Но в официальных документах детального разъяснения я не встретил.

Но из двух зол я выбрал бы последнее. В этом случае я бы просто оставлял ту сову, в которой уверен. Если этого не делать, то все равно: хотя бы сохраняется корректность пересчетов, хотя и тормозиться их работа.

Проблема не настолько тривиальна, как кажется. - Дело в том, как показали мои опыты, что, когда снимается галочка "Разрешить советнику торговать", то работа советника не останавливается - так же проходят все расчеты на каждом тике. Просто сделки советника не выводятся к серверу. Но, если в этих расчетах напиханы эти "слипы" (не совсем корректно), то если таких советников стоит 5-10, то они конкретно могут тормозить исполнение актуального советника, который сейчас торгует.

Да, некоторые программисты ставят контроль разрешения торговать и на этом основании пропускают работу совы. Но чаще этого не делается. И если код закрытый, то мы вообще не можем понять - тормозит или нет работу (и какая сова конкретно). - Сейчас полажу на эту тему по форуму поиском. Что-то тормознул.

Спасибо Arles за вопрос, что напомнил и актуализировал. Раньше у меня опыта не хватало понять что писали на эту тему. Сейчас заново полажу.

 
Arles:

Советник анализирует только ту пару, на которой висит. На какой паре раньше появился сигнал - там и открывается ордер. Но бывает, что на двух парах одновременно появляется сигнал. И открывается, как ни странно, 2 ордера, хотя в советнике проверка вообще на любой открытый ордер есть, и открывать второй он не должен. А нужно это для того, что денег мало на депозите.  

 

Да, но когда 1-ый закончил работу и открыл ордер, то 2-ой, приступив к работе, какое-то непродолжительное время НЕ ВИДИТ, что ордер уже есть. Либо он приступает к работе раньше, чем ордер откроется.
--

И еще: когда 1-ый советник Sleep(1000) второй ждет или начинает работу?

С малым депозитом по нескольким парам не торгуют (житейский совет).

Технически, чтобы разные советники учитывали общее количество ордеров, можно попробовать такую схему:

    int li_total - OrdersTotal();
    if (li_total == 0) Sleep (1000);
    li_total - OrdersTotal();
    if (li_total == 0) OrderSend();

Не знаю, на сколько чётко она будет отрабатывать (м\у 2-мя должно работать). Надёжнее сделать через глобальные переменные терминала, организовав "Семафор" последовательную работу. Тогда "по-барабану" сколько советников будет работать параллельно.