Повторные срабатывания ордера

 

Пишу советник на rsi.

Алгоритм простой:

1. При выходе из зоны перекупленности, сверху, срабатывает ордер на продажу.

2. При выходе из зоны перепроданности, снизу, срабатывает ордер на покупку

3. На ордера ставятся стоплосы и тейкпрофиты 5,7 пунктов (таймфрейм 15 минут).

Не знаю насколько жизнеспособен этот алгоритм, но при торговли вручную есть некая положительная динамика (для первого советника сойдёт :)

Столкнулся со следующей проблемой, после пересечения линий 30,70 RSI, сробатывает сразу несколько ордеров вместо одного.

Пробовал с глобальной переменной, которая бы блокировала новые открытия, но всё равно не работает.

Вот код:

bool CHANEL=false;
int start()
{


double rsi=iRSI(NULL,0,15,PRICE_CLOSE,0);
double rsi1=iRSI(NULL,0,15,PRICE_CLOSE,1);

bool moveup = rsi >= rsi1;


if(CHENAL==false){

if(rsi == 70 && !moveup) { ticket=OrderSend(Symbol(),OP_SELL,1000,Ask,0,0,0); CHENAL=TRUE; }
if(rsi == 30 && moveup){ ticket=OrderSend(Symbol(),OP_BUY,1000,Ask,0,0,0); CHENAL=TRUE; }

}


return;
}

В чём может быть ошибка?

И как вообще в советниках блокируются повторные срабатывания, при пересечении некой условной цены.

Ведь цена ходит ходуном в разные стороны во время движения, а не сразу идёт вверх или вниз.

 

Ну во-первых логическая переменная CHANEL никакого отношения к последующей CHENAL не имеет...названия разные...:-)))

К сожалению даже не скомпилируется...

 
zoritch:

Ну во-первых логическая переменная CHANEL никакого отношения к последующей CHENAL не имеет...названия разные...:-)))

К сожалению даже не скомпилируется...


Спасибо, не заметил :)

Но всё равно не работает. Открывает пачку ордеров.

bool CHANEL=false;
int start()
{

int ticket;
double rsi=iRSI(NULL,0,15,PRICE_CLOSE,0);
double rsi1=iRSI(NULL,0,15,PRICE_CLOSE,1);

bool moveup = rsi >= rsi1;


if(CHANEL==false){

if(rsi == 70 && !moveup) { ticket=OrderSend(Symbol(),OP_SELL,1000,Ask,0,0,0); CHANEL=TRUE; }
if(rsi == 30 && moveup){ ticket=OrderSend(Symbol(),OP_BUY,1000,Ask,0,0,0); CHANEL=TRUE; }

}


return;
}

 

if (OrdersTotal () > 1)

return (-1);

 
Bicus:

if (OrdersTotal () > 1)

return (-1);


Спасибо. Заработало.

Даже прибыль небольшую показал на тестере, правда позже всю прибыль слил :)

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

С параметрами стоплоса и тейккпрофита можно поиграться, и машки например добавить :)

Вот рабочий код:

int start() 
{

int ticket; 
double rsi=iRSI(NULL,0,15,PRICE_CLOSE,0);
double rsi1=iRSI(NULL,0,15,PRICE_CLOSE,1);

bool moveup = rsi >= rsi1;

if(OrdersTotal()==0) {

if(rsi < 75 && rsi > 70 && !moveup) { ticket=OrderSend(Symbol(),OP_SELL,1,Ask,3,Bid-30*Point,Ask+7*Point,"My order ",16384,0,Green); }
if(rsi > 25 && rsi < 30 && moveup){ ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Bid-30*Point,Ask+7*Point,"My order ",16384,0,Green); }

}

return(-1); 

}


 

Еще добавил бы проверку на нужную пару, иначе у вас постоянно будет открыто не более 1 ордера, даже если вы откроете 10 инструментов.

int start() 
{

int ticket; 
int Counter;

for (Counter == OrdersTotal () - 1; Counter >= 0; Counter--)
{
   if (!OrderSelect (Counter, SELECT_BY_POS))
     return (-1);
   
   if (OrderSymbol () == Symbol ())
     return (-1);
}

double rsi=iRSI(NULL,0,15,PRICE_CLOSE,0);
double rsi1=iRSI(NULL,0,15,PRICE_CLOSE,1);

bool moveup = rsi >= rsi1;


if(OrdersTotal()==0) {

if(rsi < 75 && rsi >= 70 && !moveup) { ticket=OrderSend(Symbol(),OP_SELL,1,Ask,3,Bid-30*Point,Ask+7*Point,"My order ",16384,0,Green); }
if(rsi > 25 && rsi <= 30 && moveup){ ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Bid-30*Point,Ask+7*Point,"My order ",16384,0,Green); }

}

return(-1); 

}
 
Bicus:

Еще добавил бы проверку на нужную пару, иначе у вас постоянно будет открыто не более 1 ордера, даже если вы откроете 10 инструментов.

Спасибо. Так лучше.

Правда не большая ошибка в строке

for (Counter == OrdersTotal () - 1; Counter >= 0; Counter--)
С двойным равно не работает, только с одинарным.
 

Ещё столкнулся с проблемой. Как вытащить данные последней закрытой сделки (без учёта инструмента)? В частности объём лота, профит или убыток по ней.

Читал, что нужно загружать историю с помощью функции FileOpenHistory, но не нашёл примера как с помощью неё вытащить последнию сделку.

Так-же возможно есть способ проще, посмотреть последнею сделку?

 
QTR:

Читал, что нужно загружать историю с помощью функции FileOpenHistory, но не нашёл примера как с помощью неё вытащить последнию сделку.

//показывает время закрытия последнего ордера
  datetime OrderCloseTime_(int type) // привести к типу возвращаемого значения
   {
   datetime Time_=0;
   for(int i=0;i<OrdersHistoryTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) break;
        {
         ( OrderCloseTime()>Time_) { Time_=OrderCloseTime();          ; } //можно вписать что угодно
        
        }
     }
  return(Time_); //возвращаем интересующее значение
   }
 

Спасибо!

Я правда не в том направлении искал. Всё можно посмотреть с помощью функций OrderSelect, и дочерних функций.

Файловые операции не нужны для этого.

Написал небольшой кусок кода, для вывода информации по последней сделке(собственно что мне было и нужно :))

int accTotal=OrdersHistoryTotal();
if(OrderSelect(accTotal-1,SELECT_BY_POS,MODE_HISTORY)==true) {

datetime ctm=OrderOpenTime();

int YY=TimeYear(ctm); // Year
int MN=TimeMonth(ctm); // Month
int DD=TimeDay(ctm); // Day
int HH=TimeHour(ctm); // Hour
int MM=TimeMinute(ctm); // Minute

Comment("Инфо. последней сделки: "+"\nЛот: "+OrderLots()+"\nПрибыль: "+OrderProfit()+"\nВремя закрытия: ", DD,".",MN,".",YY," ",HH,":",MM);

} // конец условия

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