[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 1121

 

Добрый день/ночь

Пытаюсь сделать реверс сделки вот таким примитивным способом, который не работает (расчёт в советнике проходит по тикам):

if(CalculateCurrentOrders(Symbol())>0 && Close[1]<LowLevel) // определяет были ли ордера на покупку && было ли закрытие свечи ниже нижнего уровня

{

CheckForClose(); // закрытие ордера

OpenSell(); // открытие ордера на продажу

return;

}

Подскажите в чём я туплю? Был бы признателен так же за ссылки, которые позволили бы ликвидировать этот пробел.

 

dzhini:

Пытаюсь сделать реверс сделки вот таким примитивным способом, который не работает (расчёт в советнике проходит по тикам):

if(CalculateCurrentOrders(Symbol())>0 && Close[1]<LowLevel) // определяет были ли ордера на покупку && было ли закрытие свечи ниже нижнего уровня


вот в этой функции вы вероятно считаете все ордера. а надо на Бай
 

Как определить сколько минут между Time1 и Time2?

datetime Time_1     = D'2011.01.12 13:30';
datetime Time_2     = D'2011.01.05 10:30'; 

минут = Time_1- Time_2
 
sergeev:
вот в этой функции вы вероятно считаете все ордера. а надо на Бай

Это стандартная функция:

int CalculateCurrentOrders(string symbol)
{
int buys=0,sells=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;
}
}

if(buys>0) return(buys);
else return(-sells);

}

если >0 то это ордера на покупку, если <0 то на продажу )))

 
Eliza:

Как определить сколько минут между Time1 и Time2?

разница возвращает число секунд.

делим на 60. получаем число минут.

 
Реверс сделки. Изменил структуру советника - убрал функции. Как же сделать так, чтобы он закрывался и открывался на одной свече при определённых условиях.

extern double TP = 70; //takeprofit
extern double SL = 0; //stoploss
extern double Lot = 0.1;

double HighLevel;
double LowLevel;
int resBuy=0;
int resSell=0;


//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
   HighLevel=High[1];
   LowLevel=Low[1];
   return;
}

//+------------------------------------------------------------------+
//| expert function |
//+------------------------------------------------------------------+

void start()
{

  if(Bars<100 && IsTradeAllowed()==false) return;


  if(resBuy==0 && resSell==0 && CheckBreak()==-1) 
   {
     resSell=OrderSend(Symbol(),OP_SELL,Lot,Bid,2,0,Bid -TP,"",MAGICMA,0,Red); 
     HighLevel=LowLevel;
     LowLevel=Close[1]; 
     return;
   }

   if(resBuy==0 && resSell==0 && CheckBreak()==1) 
   {
     resBuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,2,0,Ask + TP,"",MAGICMA,0,Blue);
     LowLevel=HighLevel;
     HighLevel=Close[1];
     return;
   }

  if(resBuy!=0 && resSell==0 && Close[1]<LowLevel) //-------------------------------------интересует вот эта часть: закрытие и открытие на одном баре
   { 
     bool closeBuy=OrderClose(resBuy, Lot, Bid, 2, Blue);
//   while(!IsTradeAllowed()) Sleep(100);
     resSell=OrderSend(Symbol(),OP_SELL,Lot,Bid,2,0,Bid -TP,"",MAGICMA,0,Red);
     HighLevel=LowLevel;
     LowLevel=Close[1]; 
     return;
   }

  if(resSell!=0 && resBuy==0 && Close[1]>HighLevel) //-------------------------------------интересует вот эта часть: закрытие и открытие на одном баре
   {
     bool closeSell=OrderClose(resSell, Lot, Ask, 0.0002, Red);
//   while(!IsTradeAllowed()) Sleep(100);
     resBuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,2,0,Ask + TP,"",MAGICMA,0,Blue);
     LowLevel=HighLevel;
     HighLevel=Close[1];
     return;
   }

}

//----------------------------------------------------------------- Check Low&High break (Func)

double CheckBreak()
{
   double candle=Open[1]-Close[1];

   if(candle>0 && Low[1]<LowLevel) return(-1);
   if(candle<0 && High[1]>HighLevel) return(1);
}
 
sergeev:

разница возвращает число секунд.

делим на 60. получаем число минут.

У меня просто выводит дату 1971.03.04 12:00, может это преобразовывать надо?

extern datetime Time_1     = D'2011.01.12 13:30'; 
extern datetime Time_2     = D'2011.01.05 10:30'; 

bool   Commentari      = true;

int start()
  {

if (Commentari){
 Comment(
         "\n Дата  =  " + TimeToStr((Time_1-Time_2)/60)," минут",
      
         "\n==============================");}
   return(0);
  }
 
Eliza:

У меня просто выводит дату, может это преобразовывать надо?

во первых - почему вы умножаете на 60

во вторых - если вы хотите представить на экране число минут в виде времени типа 00:15,
то ни делить ни умножать на 60 не надо.

 
sergeev:

во первых - почему вы умножаете на 60

во вторых - если вы хотите представить на экране число минут в виде времени типа 00:15,
то ни делить ни умножать на 60 не надо.

да я исправила на деление, но год выходит 1970.01.01 02:51

мне не для экрана нужно, я хотела просто найти количество минут без дат, за этот промежуток времени....

если даже не делить все равно выводит дату, или мне надо еще вычесть дату от которой отталкивается функция сейчас прочитала еще раз про

  • datetime - дата и время, беззнаковое целое число, содержащее количество секунд, прошедших с 0 часов 1 января 1970 года.
  • extern datetime Time_1     = D'2011.01.12 13:30'; 
    extern datetime Time_2     = D'2011.01.05 10:30'; 
    
    datetime me_2     = D'1970.01.01 00:00'; 
    
    bool   Commentari      = true;
    
    int start()
      {
    
    if (Commentari){
     Comment(
             "\n Дата  =  " + TimeToStr(me_2-(Time_1-Time_2))," минут",
          
             "\n==============================");}
       return(0);
      }

  • если вычитаю дату 1970.01.01 02:51 то он выбрасывает то что invalid time, мне нужно просто количество минут получить из этого промежутка времени, если их к примеру 25000 минут в этом промежутке то мне нужна эта цифра 25000... что типа того(
  • или это не возможно получить путем языка мкл?
 

Если вам нужно просто число минут, то вам абсолютно не зачем пользоваться TimeToStr

Время - это обычное число int

Или как вариант - пользоваться TimeToStr только с флагом TIME_MINUTE