Ну во-первых логическая переменная CHANEL никакого отношения к последующей CHENAL не имеет...названия разные...:-)))
К сожалению даже не скомпилируется...
Ну во-первых логическая переменная 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);
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); }
Еще добавил бы проверку на нужную пару, иначе у вас постоянно будет открыто не более 1 ордера, даже если вы откроете 10 инструментов.
Спасибо. Так лучше.
Правда не большая ошибка в строке
for (Counter == OrdersTotal () - 1; Counter >= 0; Counter--)С двойным равно не работает, только с одинарным.
Ещё столкнулся с проблемой. Как вытащить данные последней закрытой сделки (без учёта инструмента)? В частности объём лота, профит или убыток по ней.
Читал, что нужно загружать историю с помощью функции FileOpenHistory, но не нашёл примера как с помощью неё вытащить последнию сделку.
Так-же возможно есть способ проще, посмотреть последнею сделку?
Читал, что нужно загружать историю с помощью функции 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);
} // конец условия
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Пишу советник на 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;
}
В чём может быть ошибка?
И как вообще в советниках блокируются повторные срабатывания, при пересечении некой условной цены.
Ведь цена ходит ходуном в разные стороны во время движения, а не сразу идёт вверх или вниз.