Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Kilnart
260
Kilnart  

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

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  

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

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

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

Igor Kondjukov
118
Igor Kondjukov  
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
1740
TarasBY  
kilnart:

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

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

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

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

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

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

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

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

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

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


я о чем то таком же и думал, спасибо
Kilnart
260
Kilnart  
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  
TarasBY:
Не чётко (абы как) прописаны условия торговли.

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

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

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

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

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

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

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

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

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

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