Переключатель: отключение бай (или) селл на время

 

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

Я уже весь моск сломал:

Тема: Есть условие входа вверх (бай) и зеркальное условие входа вниз (селл) и механизм закрывания открытых ордеров.
Проблема такая: Когда срабатывает бай (или селл) и закрывается ордер, открывается ордер по новой в том же направлении.

Помогите: Отключить на время открытие в том же направлении пока не сломается старый сигнал и не появится новый.

 
Помогаю... Отключил :-)
 
yvgorshkov писал (а) >>
Помогите: Отключить на время открытие в том же направлении пока не сломается старый сигнал и не появится новый.

Вам, видимо, нужно вставить проверку на существование позиции. Посмотрите в моей ветке функцию ExistPositions(). Где-то в самом начале...

 
Я так полагаю, что следующими будут слова товарища, что он "далек от программирования", и воспользоваться твоим предложением он не сможет. И единственным выходом будет "код в студию!".
 
KimIV писал (а) >>

Вам, видимо, нужно вставить проверку на существование позиции. Посмотрите в моей ветке функцию ExistPositions(). Где-то в самом начале...

Спасибо за ответ, эксперт на самом деле не замысловат (кроме вот этой пробемы) и в каждый момент времени у него только одна позиция (если есть условие на вход) или 0 позиций, если будет в списке открытых позиций более 1 то грохаются все позиции.

Тока не допираю как это временное отключение сделать, чтобы он на том же сигнале не входил.

//---- Внешние переменные
extern double lotsize = 0.1;


void CloseAllOrders()
{

Здесь закрываются все позиции;

}


void CheckForOpen()
{

if(Условие на вход вверх)

{
OrderSend(Symbol(),OP_SELL,lotsize,Bid,3,0,0,"Встаем вверх",39,0,Red);
}


if(Условие на вход вниз)
{
OrderSend(Symbol(),OP_BUY,lotsize,Ask,3,0,0,"Встаем вверх",39,0,Blue);
}

}




void CheckContinue()
{
OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
if(OrderType()==OP_BUY)
{
if(

Условие на выход из байпозиции

)
{
CloseAllOrders();
}

}

if(OrderType()==OP_SELL)
{
if(

Условие на выход из селлпозиции

)
{
CloseAllOrders();
}
}
}
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----


if(OrdersTotal()==0)
{
CheckForOpen();
}


if(OrdersTotal()==1)
{
CheckContinue();
}


if(OrdersTotal()>1)
{
CloseAllOrders();
}
//----
return(0);
}
//+------------------------------------------------------------------+



Это на самом деле мой первый опыт написания эксперта. Я пробовал здесь заводить переменную trade со значениями noset, buydeny, selldeny но эксперт реагировал заключением протвоположных сделок т.е. бай-селл-бай-селл-бай-селл ... и в другом случае если он сначала входил в селл то все сделки у него были селл и на оборот. Одним словом если у кого по структуре есть идеи...

Спасибо всем откликнувшимся.

 
yvgorshkov писал (а) >>
Тока не допираю как это временное отключение сделать, чтобы он на том же сигнале не входил.

Организуйте логику эксперта таким вот образом:

Словами: Если есть сигнал на вход, проверяем существование позиции. Если нет позиции, входим

Код:

if (ЕстьСигнал) {
  if (!ExistPositions() {
    // выполняем вход
  }
}
 
Так у него ж проблема не в этом, а в том, чтобы дождаться следующего сигнала. А два ордера у него и так не откроются.
 
KimIV писал (а) >>

Организуйте логику эксперта таким вот образом:

Словами: Если есть сигнал на вход, проверяем существование позиции. Если нет позиции, входим

Код:

Я немножко не понял "существование позиции" где? в списке текущих ордеров или в списке хистори?


Уважаемый KimIV, простите мне мою неспособность объяснять. Попробую еще раз.

1. Советник всегда держит или 0 или 1 позицию, если позиций больше он их закрывает.

2. Советник входит по УСЛОВИЕВХОДА и выходит по УСЛОВИЕ ВЫХОДА.

3. Бывает так что соблюдается и УСЛОВИЕВХОДА и УСЛОВИЕ ВЫХОДА тогда он закрывает позицию и т.к. УСЛОВИЕВХОДА соблюдается на следующем тике он заново входит и так продолжается пока УСЛОВИЕВХОДА не окажется ложным.

4. Проблема: как сделать так, чтобы советник не входил пока УСЛОВИЕВХОДА не перестанет быть ложным. Если оно станет ложным, он конечно не войдет по нему, а войдет по когда оно возникнет еще раз.

 

Попробуй так

//---- Внешние переменные
extern double lotsize = 0.1;
bool flagup=false;

bool flagdown=false;

void CloseAllOrders()
{

Здесь закрываются все позиции;

}


void CheckForOpen()
{

if(Условие на вход вверх)

{
if(!flagup)if(OrderSend(Symbol(),OP_SELL,lotsize,Bid,3,0,0,"Встаем вверх",39,0,Red))

flagup=true;
}

else flagup=false;

if(Условие на вход вниз)
{
if(!flagdown)if(OrderSend(Symbol(),OP_BUY,lotsize,Ask,3,0,0,"Встаем вверх",39,0,Blue))

flagdown=true;
}
else flagdown=false;
}

void CheckContinue()
{
OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
if(OrderType()==OP_BUY)
{
if(

Условие на выход из байпозиции

)
{
CloseAllOrders();
}

}

if(OrderType()==OP_SELL)
{
if(

Условие на выход из селлпозиции

)
{
CloseAllOrders();
}
}
}
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----


if(OrdersTotal()==0)
{
CheckForOpen();
}


if(OrdersTotal()==1)
{
CheckContinue();
}


if(OrdersTotal()>1)
{
CloseAllOrders();
}
//----
return(0);
}
//+------------------------------------------------------------------+

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

 
yvgorshkov писал (а) >>

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

Я уже весь моск сломал:

Тема: Есть условие входа вверх (бай) и зеркальное условие входа вниз (селл) и механизм закрывания открытых ордеров.
Проблема такая: Когда срабатывает бай (или селл) и закрывается ордер, открывается ордер по новой в том же направлении.

Помогите: Отключить на время открытие в том же направлении пока не сломается старый сигнал и не появится новый.

Объясняю на пальцах:

До блока открытия ордеров прописываем блок проверки закрытых ордеров. Проверяем несколько последних (можно не все а только 2-3 последних). Задаём две переменные со значением не равным "0". Одна переменная - время закрытия ордерера БАЙ. Задали, что она изначально равна=2. Вторая переменная закрытие ордера СЕЛЛ. Задали изначально равна =2. Блок проверки закрытых ордеров начинает работу с самого древнего ордера. Пройдемся по циклу и присвоим переменным время закрытия ордеров OrderCloseTime(). Учитываем, что если ордеров какого то типа (к примеру Бай) не было вообще, то переменная, соответствующая закрытию последнего ордера БАЙ останется равна "2". Если в алгоритме появилась ошибка, то скорее всего время закрытия последнего ордера получится равным "0".  Если переменные будут равны времени закрытия ордеров, то сравнение этих переменных даст искомое неравенство. Если первая переменная (OrderCloseTime() орера БАЙ) больше второй(OrderCloseTime() орера СЕЛЛ), то последним закрывался ордер БАЙ. Если вторая переменная (OrderCloseTime() орера СЕЛЛ) больше первой (OrderCloseTime() орера БАЙ), то последним закрывался ордер СЕЛЛ. 

Теперь,понятно какое неравенство использовать для "Отключить на время открытие в том же направлении пока не сломается старый сигнал и не появится новый"

 
yvgorshkov писал (а) >>
4. Проблема: как сделать так, чтобы советник не входил пока УСЛОВИЕВХОДА не перестанет быть ложным. Если оно станет ложным, он конечно не войдет по нему, а войдет по когда оно возникнет еще раз.

Не усложняйте... Именно так и делайте, как говорите:

1. В отдельную функцию вынесите блок формирования сигнала на вход.

2. НЕ формируйте ложный сигнал, чтобы не вводить в заблуждение советник. Формируйте только истинный сигнал.

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