НУЖНА ПОМОЩЬ!!! Ожидание второй части сигнала

 

Здравствуйте!

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

   ... Переменные New_bar и Time_0 прописаны перед функцией start
   int  New_bar;                           //Наличие нового бара 0 или 1(истина)
   datetime Time_0;                        //Время открытия бара
   ... 

   New_bar=0;                              //Параметр нового бара обнулен
   if (Time_0!=Time[0])                    //Если время не соответсвует
      {
       New_bar=1;
       Time_0=Time[0];
      }
   //---long signal---
   if (New_bar==1 && st2<st4 && st1>st3)   //Если есть новый бар и пересечение вверх
      bool Wait_up=false;                  //переменная ожидание разницы
      bool Wait_dn=false;                  //переменная ожидание разницы
      if ((st1-st3)>Diff)                  //если разница больше минимального значения
         {Opn_B=true;                      //открыть бай
      }else 
         {Wait_up=true;}                   //в противном случае включается флаг ожидание разницы
   if (New_bar==1 && Wait_up==true)        //Если появился новый бар и включен флаг "ожидание"
      if ((st1-st3)>Diff)                  //то проверяется разница
         {Opn_B=true;                      //открывается бай
          Wait_up=false;}                  //отключается ожидание
   //---short signal---        
   if (New_bar==1 && st2>st4 && st1<st3)
      Wait_dn=false;
      Wait_up=false;
      if ((st3-st1)>Diff)
         {Opn_S=true;
      }else
         {Wait_dn=true;}
   if (New_bar==1 && Wait_dn==true)
      if ((st3-st1)>Diff)
         {Opn_S=true;
          Wait_dn=false;}

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

ПОМОГИТЕ: Мне надо чтобы ордер открывался один раз в одном направлении после выполнения вышеуказанных условий!!!

 

 Условие открытия при формировании новой свечи и один раз в одном направлении, срабатывает, когда код выглядит так:

   New_bar=0; 
   if (Time_0!=Time[0]) 
      {
       New_bar=1;
       Time_0=Time[0];
      }
   //---long signal---
   if (New_bar==1 && st2<st4 && st1>st3)
      if ((st1-st3)>Diff)
         Opn_B=true;
   //---short signal---
   if (New_bar==1 && st2>st4 && st1<st3)
      if ((st3-st1)>Diff)
         Opn_S=true;

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

Стоит добавить bool Wait_up=false; bool Wait_dn=false; и все перестает работать!!!

Пожалуйста, помогите!

 

Перед установкой ордера поставте проверку на количество установленных ордеров (самый простой способ)

if(OrdersTotal()<1){
   установить_ордер();
}
 
xeon >>:

Перед установкой ордера поставте проверку на количество установленных ордеров (самый простой способ)

Эта проверка есть. Проблема заключается не в том что одновременно открывается несколько ордеров в одном направлении, а в том что как только закрывается один, тут же на этом месте открыватся новый.

 
WindSW >>:

Эта проверка есть. Проблема заключается не в том что одновременно открывается несколько ордеров в одном направлении, а в том что как только закрывается один, тут же на этом месте открыватся новый.

Очень просто. При открытии позиции обнуляйте все вычисления, которые формировали данный сигнал. И всё. Так всегда надо делать. А у Вас получается, что все значения, которые сформировали сигнал остаются такими же при открытии позиции и при её закрытии эти же значения являются критериями для открытия очередной сделки. Думаю, так.

 
Насколько я могу судить по формулировки проблеммы.
 
FOReignEXchange >>:

Очень просто. При открытии позиции обнуляйте все вычисления, которые формировали данный сигнал. И всё. Так всегда надо делать. А у Вас получается, что все значения, которые сформировали сигнал остаются такими же при открытии позиции и при её закрытии эти же значения являются критериями для открытия очередной сделки. Думаю, так.

Здесь все закрыто и обнулено

 
Если обнулено, то сделка не может просто так сразу открываться после закрытия предыдущей. Либо к закрытию первой уже сформировался сигнал для следующего входа, либо не всё обнулено. Другого не дано. Это ведь так?
 
У Вас не понятно. Может условие появления пересечения не обнуляется при открытии сделки. Какой переменной или чем вообще у Вас выражается присутствие пересечения?  Может появление пересечения не обнуляется. Вобщем не знаю тогда. Что-то не обнуляется, думаю.
 

Все еще проще. Заведите флаг - LastDir, например. Как только открыли длинную, присваивайте ему 1, короткую - 2. В init занулите флаг. При открытии очередной длинной позиции проверяйте флаг на равенство 1. Если равно, значит не открывайте вновь длинную, так как до этого уже была длинная поза. Точно также с короткой - проверяйте на равенство 2.

Флаг изменяйте только при успешном открытии позиции.

 

Спасибо, за помощь и участие. Обязательно учту ваши советы.

Сейчас походил по улице, подышал кислородом и сразу нашел ошибки. Одна из них отсутвие "{" после проверок пересечения плюс в логике есть один пробел!

      }else 
         {Wait_up=true;}

Логическая ошибка здесь. Эта часть постоянно включает проверку на разницу, поэтому позиция открывается на каждой новой свече. Если кто-то сталкивался с реализацией подобного, прошу поделиться опытом.

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