Такое условие не подходит if(LastProfit>0) {TradeEnd=(int)LastCL_time;}
LastCL_time - это datetime, т. е. количество секунд, а Вы хотите привести его к часам. Выделите часы суток из секунд. Для этого существует функция TimeHour().
Логично, теперь надо правильно это объяснить советнику
т.е.
не работает, советник продолжает торговлю
Логично, теперь надо правильно это объяснить советнику
т.е.
if(LastProfit>0) {TradeEnd=TimeHour(LastCL_time);}
не работает, советник продолжает торговлю
К сожалению, еще не научился править код, не видя его (усиленно работаю над этим навыком). Поэтому на текущем уровне моего развития от Вас потребуется как-то показать весь код. ))
P. S. Для красивого оформления кода используйте кнопку SRC.
К сожалению, еще не научился править код, не видя его (усиленно работаю над этим навыком). Поэтому на текущем уровне моего развития от Вас потребуется как-то показать весь код. ))
Тут править то ни чего не надо.
Есть
Последнее время закрытия ордера надо преобразовать в часы.
Как это сделать своими словами ??
Типа того:
for(i=0;i<OrdersHistoryTotal();i++) if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic) {
if(LastCL_time<OrderCloseTime()){LastCL_time=OrderCloseTime();}
LastProfit=OrderProfit()+OrderSwap()+OrderCommission();
}
if(LastProfit>0) {TradeEnd=TimeHour(LastCL_time);}
Тут править то ни чего не надо.
Есть
Последнее время закрытия ордера надо преобразовать в часы.
Как это сделать своими словами ??
Таким образом, проблема в другом месте кода, который занимается открытием ордеров. Вот этот кусок кода и нужно видеть. Без него найти ошибку не получится.
Правильно, проблема в другом месте кода, скорее всего в ограничении времени.
Если поменять значение в условии просто на числовое, то продолжает торговать пока не наступит значение внешнего параметра.
т.е.
//----------------
if(LastProfit>0) {TradeEnd=12;}
Я использую такой код для ограничения времени:
extern int TradeStart = 1;
extern int TradeEnd = 15;
//---------------------------+
int TradeStartH,TradeStartM,TradeEndH,TradeEndM;
void start() {
if(TimeAllowed()) {
if(условия совпали) SendOrder(0,
if(условия совпали) SendOrder(1,
}
} //StartEnd
//---------------------------------------------------------------------+
bool TimeAllowed() {
int HOUR=Hour(); int MIN=Minute();
if (IsTesting()) { HOUR=TimeHour(Time[0]); MIN=TimeMinute(Time[0]); }
bool TradeAllow=true;
if (TimeTrade) {
if (TradeStartH>TradeEndH) { // час открытия больше часа закрытия
if (HOUR<TradeStartH && HOUR>TradeEndH) TradeAllow=false;
}else{ // час открытия меньше часа закрытия
if (HOUR<TradeStartH || HOUR>TradeEndH) TradeAllow=false;
}
if (HOUR==TradeStartH && MIN<TradeStartM) TradeAllow=false;
if (HOUR==TradeEndH && MIN>=TradeEndM) TradeAllow=false;
}
if (TradeAllow) return(true); else return(false);
}
//---------------------------------------------------------------------+
void init() {
int DP=StringFind((string)TradeStart,":",0);
TradeStartH = StrToInteger(StringSubstr((string)TradeStart,0,DP));
TradeStartM = StrToInteger(StringSubstr((string)TradeStart,DP+1,StringLen((string)TradeStart)-1));
DP=StringFind((string)TradeEnd,":",0);
TradeEndH = StrToInteger(StringSubstr((string)TradeEnd,0,DP));
TradeEndM = StrToInteger(StringSubstr((string)TradeEnd,DP+1,StringLen((string)TradeEnd)-1));
}
Всё!!!
Работает теперь отлично.
Надо было просто перенести кусок кода из void init() в void start() не знаю почему он там был, хотя всё работало без подмены установленного значения.
И преобразование добавить за пределами зоны старта:
//| Преобразование типа datetime в строку формата HH.MM.SS |
//+----------------------------------------------------------+
string HourToStr(datetime ht) {
string hh="", mm="", ss="";
if (TimeHour(ht)<10) hh="0"+(string)TimeHour(ht); else hh=(string)TimeHour(ht);
if (TimeMinute(ht)<10) mm="0"+(string)TimeMinute(ht); else mm=(string)TimeMinute(ht);
if (TimeSeconds(ht)<10) ss="0"+(string)TimeSeconds(ht); else ss=(string)TimeSeconds(ht);
return(hh+":"+mm+":"+ss);
}
Далее нужное условие теперь выглядит так:
И во входных параметрах поменять с int на string
ТЕМА ЗАКРЫТА

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Какое время у закрытого ордера ??
Есть ограничение работы советника по времени
int TradeStart = 1;
int TradeEnd = 17;
datetime LastCL_time;
void start() {
double LastProfit = 0;
for(i=0;i<OrdersHistoryTotal();i++) if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==OrderSymbol()&& OrderMagicNumber()==Magic) {
LastCL_time=OrderCloseTime();
LastProfit=OrderProfit()+OrderSwap()+OrderCommission();
}
Надо после закрытия ордера с профитом поменять значение TradeEnd = время закрытия ордера;
например:
Такое условие не подходит if(LastProfit>0) {TradeEnd=(int)LastCL_time;}