Полазил по форуму ответа не нашел

 

Привет ребят. Идея следующая.

double rsi1   = iRSI(Symbol(),0,14,PRICE_CLOSE,1);
double parab  = iSAR(Symbol(),0,0.02,0.2,0);
double parab1 = iSAR(Symbol(),0,0.02,0.2,1);


if(parab1>High[1] && parab<Bid && rsi1<50) OpenBuy();
if(parab1<Low[1] && parab>Ask && rsi1>50) OpenSell();
if(parab1>High[1] && parab<Bid && rsi1>50) OpenSell();
if(parab1<Low[1] && parab>Bid && rsi1<50) OpenBuy();

соответственно OpenBuy() открывает ордера на покупку, OpenSell() на продажу.

Мое условие должно сработать только один раз и открыть только один ордер. При следующем пересечении параболика, советник должен рассматривать ситуацию как будто ордеров нет.

Не могу реализовать данное условие. Если пишу функцию при которой идет проверка новый/старый бар, по какой то причине (догадываюсь, долго описывать) не работает.

Также есть мнение, при открытии нового ордера брать время открытия и в условии прописать сравнивать время и открывать или нет, но показалось это гемором.

Отсюда вопрос, есть ли какая нить возможность упростить решение.

 

Сравнивайте время открытия и время текущего бара. Вот так

if(iTime(Symbol(),PERIOD_H1,Timing)>OrderOpenTime())

Это условие например гарантирует один ордер на одном часовом баре. если Timing=0, на двух если 1 и т.д.

 
kilnart:

Привет ребят. Идея следующая.

соответственно OpenBuy() открывает ордера на покупку, OpenSell() на продажу.

Мое условие должно сработать только один раз и открыть только один ордер. При следующем пересечении параболика, советник должен рассматривать ситуацию как будто ордеров нет.

Не могу реализовать данное условие. Если пишу функцию при которой идет проверка новый/старый бар, по какой то причине (догадываюсь, долго описывать) не работает.

Также есть мнение, при открытии нового ордера брать время открытия и в условии прописать сравнивать время и открывать или нет, но показалось это гемором.

Отсюда вопрос, есть ли какая нить возможность упростить решение.


У меня в советнике так:


int i,cnt,ticket,total;

bool flag=тrue;

int start()

{

---------

---------

---------

---------


total=OrdersTotal();
if(total<30)
{
cnt=OrdersHistoryTotal()-1;
for(i=cnt;i>=0;i--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
if(OrderOpenTime()>=Time[0]) { //-если позиция открывается на нулевом баре
flag=false; //---текущего символа
break;
}
}
cnt=OrdersTotal()-1;
for(i=cnt;i>=0;i--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderOpenTime()>=Time[0]) { //-если позиция открывается на нулевом баре
flag=false; //---текущего символа
break;
}
}

if(!flag) return(0);

---------

---------

---------

---------

---------

 
kilnart:

Привет ребят. Идея следующая.

соответственно OpenBuy() открывает ордера на покупку, OpenSell() на продажу.

Мое условие должно сработать только один раз и открыть только один ордер. При следующем пересечении параболика, советник должен рассматривать ситуацию как будто ордеров нет.

Не могу реализовать данное условие. Если пишу функцию при которой идет проверка новый/старый бар, по какой то причине (догадываюсь, долго описывать) не работает.

Также есть мнение, при открытии нового ордера брать время открытия и в условии прописать сравнивать время и открывать или нет, но показалось это гемором.

Отсюда вопрос, есть ли какая нить возможность упростить решение.

Не чётко (абы как) прописаны условия торговли.
 

Определяешь глобальную переменную за пределами функции start()

bool flag=false;

и небольшие изменения в коде

if(parab1>High[1] && parab<Bid && rsi1<50&&flag)
{
 OpenBuy();
flag=false;
}
if(parab1<Low[1] && parab>Ask && rsi1>50&&flag) 
{
OpenSell();
flag=false;
}
if(parab1>High[1] && parab<Bid && rsi1>50&&flag) 
{
OpenSell();
flag=false;
}
if(parab1<Low[1] && parab>Bid && rsi1<50&&flag) 
{
OpenBuy();
flag=false;
}
if(parab1<High[1]&&parab1>Low[1])flag=true;
 
paukas:

Сравнивайте время открытия и время текущего бара. Вот так

Это условие например гарантирует один ордер на одном часовом баре. если Timing=0, на двух если 1 и т.д.


я о чем то таком же и думал, спасибо
 
bwmficci:

У меня в советнике так:


int i,cnt,ticket,total;

bool flag=тrue;

int start()

{

---------

---------

---------

---------


total=OrdersTotal();
if(total<30)
{
cnt=OrdersHistoryTotal()-1;
for(i=cnt;i>=0;i--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
if(OrderOpenTime()>=Time[0]) { //-если позиция открывается на нулевом баре
flag=false; //---текущего символа
break;
}
}
cnt=OrdersTotal()-1;
for(i=cnt;i>=0;i--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderOpenTime()>=Time[0]) { //-если позиция открывается на нулевом баре
flag=false; //---текущего символа
break;
}
}

if(!flag) return(0);

---------

---------

---------

---------

---------


интересный вариант, попробую
 
TarasBY:
Не чётко (абы как) прописаны условия торговли.

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

что именно не понятно? особо про условия и не думал писать, вопрос был как открывать ордера не на каждом тике, а один раз и ждать следующего условия
Чтобы человеку помочь, нужно знать, чего нужно получить в конечном итоге. Играть в догадки надоест после пары опытов работы с заказчиками.
 
TarasBY:
Чтобы человеку помочь, нужно знать, чего нужно получить в конечном итоге. Играть в догадки надоест после пары опытов работы с заказчиками.

Чтобы человеку помочь нужно помочь. А чтобы просто .... - ничего не нужно.
 
kilnart:

Привет ребят. Идея следующая.

соответственно OpenBuy() открывает ордера на покупку, OpenSell() на продажу.

Мое условие должно сработать только один раз и открыть только один ордер. При следующем пересечении параболика, советник должен рассматривать ситуацию как будто ордеров нет.

Не могу реализовать данное условие. Если пишу функцию при которой идет проверка новый/старый бар, по какой то причине (догадываюсь, долго описывать) не работает.

Также есть мнение, при открытии нового ордера брать время открытия и в условии прописать сравнивать время и открывать или нет, но показалось это гемором.

Отсюда вопрос, есть ли какая нить возможность упростить решение.

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