Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Используй MQL5 Cloud Network. Тестируй роботов с гиперскоростью!
Kilnart
260
Kilnart 2014.02.02 11:42 

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

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() на продажу.

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

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

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

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

Vladimir Paukas
4099
Vladimir Paukas 2014.02.02 14:32  

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

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

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

Igor Kondjukov
118
Igor Kondjukov 2014.02.02 15:08  
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);

---------

---------

---------

---------

---------

TarasBY
1739
TarasBY 2014.02.02 15:13  
kilnart:

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

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

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

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

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

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

Не чётко (абы как) прописаны условия торговли.
Alexander
2441
Alexander 2014.02.02 16:57  

Определяешь глобальную переменную за пределами функции 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;
Kilnart
260
Kilnart 2014.02.02 17:14  
paukas:

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

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


я о чем то таком же и думал, спасибо
Kilnart
260
Kilnart 2014.02.02 17:15  
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);

---------

---------

---------

---------

---------


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

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

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

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

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

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

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

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

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

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

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