Какое время у закрытого ордера

 

Какое время у закрытого ордера ?? 
Есть ограничение работы советника по времени

bool  TimeTrade = true;
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=время закрытия ордера;}

Такое условие не подходит if(LastProfit>0) {TradeEnd=(int)LastCL_time;}  

 
Natashe4ka:


Такое условие не подходит if(LastProfit>0) {TradeEnd=(int)LastCL_time;}  

LastCL_time - это datetime, т. е. количество секунд, а Вы хотите привести его к часам. Выделите часы суток из секунд. Для этого существует функция TimeHour().
 
Ihor Herasko:
LastCL_time - это datetime, т. е. количество секунд, а Вы хотите привести его к часам. Выделите часы суток из секунд. Для этого существует функция TimeHour().

Логично, теперь надо правильно это объяснить советнику
т.е.

if(LastProfit>0) {TradeEnd=TimeHour(LastCL_time);}

не работает, советник продолжает торговлю 

 
Natashe4ka:

Логично, теперь надо правильно это объяснить советнику
т.е.

if(LastProfit>0) {TradeEnd=TimeHour(LastCL_time);} 

не работает, советник продолжает торговлю 

К сожалению, еще не научился править код, не видя его (усиленно работаю над этим навыком). Поэтому на текущем уровне моего развития от Вас потребуется как-то показать весь код. ))

P. S. Для красивого оформления кода используйте кнопку SRC. 

 
Ihor Herasko:

К сожалению, еще не научился править код, не видя его (усиленно работаю над этим навыком). Поэтому на текущем уровне моего развития от Вас потребуется как-то показать весь код. ))

Тут править то ни чего не надо.
Есть

LastCL_time=OrderCloseTime();


Последнее время закрытия ордера надо преобразовать в часы. 
Как это сделать своими словами ?? 

Типа того:

   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);} 


 

 
Natashe4ka:

Тут править то ни чего не надо.
Есть

LastCL_time=OrderCloseTime();


Последнее время закрытия ордера надо преобразовать в часы. 
Как это сделать своими словами ?? 

 

Да, мы это уже обговорили. Вы сказали, что не помогает - эксперт продолжает торговать. Таким образом, проблема в другом месте кода, который занимается открытием ордеров. Вот этот кусок кода и нужно видеть. Без него найти ошибку не получится.
 
Ihor Herasko:
Таким образом, проблема в другом месте кода, который занимается открытием ордеров. Вот этот кусок кода и нужно видеть. Без него найти ошибку не получится.

Правильно, проблема в другом месте кода, скорее всего в ограничении времени.
Если  поменять значение в условии просто на числовое, то продолжает торговать пока не наступит значение внешнего параметра.
т.е.

TradeEnd = 15;
//----------------
if(LastProfit>0) {TradeEnd=12;}
 

Я использую такой код для ограничения времени:

extern bool TimeTrade = true;
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);
}

 Далее нужное условие теперь выглядит так:

if(LastProfit>0) {TradeEnd=HourToStr(LastCL_time);}  

 И во входных параметрах поменять с int на string

string  TradeEnd = "15:00";

ТЕМА ЗАКРЫТА