Как заставить советник открывать по одной сделке каждый час?

 

Как дать возможность этому советнику открывать по одной сделке каждый следующий час, а не всего одну сделку?

Чем надо заменить if(OrdersTotal()<1?

#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link "https://www.metaquotes.net/"
extern int StopLoss=100;
extern int TakeProfit=40;
extern double Lots=1;
int ticket;

double B100=0;
double S100=0;
int start()
{
B100=iMA(NULL,0,100,0,MODE_SMA,PRICE_TYPICAL,0)-Ask;
S100=Bid-iMA(NULL,0,100,0,MODE_SMA,PRICE_TYPICAL,0);

if(OrdersTotal()<1

{
if( B100>=0.004 && Hour()==10)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Ask-StopLoss*Point,Ask+TakeProfit*Point,0,0,0,Blue);
}
if( S100>=0.004 && Hour()==10 )
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,Bid+StopLoss*Point,Bid-TakeProfit*Point,0,0,0,Red);
}
//---------------------------------------------------------------------
if(B100>=0.005 && Hour()==11)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Ask-StopLoss*Point,Ask+TakeProfit*Point,0,0,0,Blue);
}
if( S100>=0.005 && Hour()==11 )
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,Bid+StopLoss*Point,Bid-TakeProfit*Point,0,0,0,Red);
}
//---------------------------------------------------------------------
if(B100>=0.006 && Hour()==12)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Ask-StopLoss*Point,Ask+TakeProfit*Point,0,0,0,Blue);
}
if( S100>=0.006 && Hour()==12)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,Bid+StopLoss*Point,Bid-TakeProfit*Point,0,0,0,Red);
}

return(0);
}}

 
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
extern int StopLoss=100;
extern int TakeProfit=40;
extern double Lots=1;
int ticket;
bool x;
double B100=0;
double S100=0;
int start()
{
if(Volume[0]>2)x=true;
B100=iMA(NULL,0,100,0,MODE_SMA,PRICE_TYPICAL,0)-Ask;
S100=Bid-iMA(NULL,0,100,0,MODE_SMA,PRICE_TYPICAL,0);



if(Volume[0]<3&&x)
x=false;

{
if( B100>=0.004 && Hour()==10)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Ask-StopLoss*Point,Ask+TakeProfit*Point,0,0,0,Blue);
}
if( S100>=0.004 && Hour()==10 )
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,Bid+StopLoss*Point,Bid-TakeProfit*Point,0,0,0,Red);
} 
//---------------------------------------------------------------------
if(B100>=0.005 && Hour()==11)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Ask-StopLoss*Point,Ask+TakeProfit*Point,0,0,0,Blue);
}
if( S100>=0.005 && Hour()==11 )
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,Bid+StopLoss*Point,Bid-TakeProfit*Point,0,0,0,Red);
} 
//---------------------------------------------------------------------
if(B100>=0.006 && Hour()==12)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Ask-StopLoss*Point,Ask+TakeProfit*Point,0,0,0,Blue);
}
if( S100>=0.006 && Hour()==12)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,Bid+StopLoss*Point,Bid-TakeProfit*Point,0,0,0,Red);
} 

return(0);
}}
Естественно на часовом графике и естественно откроет только три ордера в 10, 11 и 12 часов по времени сервера, если индикатор позволит.
 

Набросал небольшую функцию, проверяющую открыт или нет ордер на заданном баре

int start() {
   if (!CheckOpenBar(Symbol(),Magic,iTime(Symbol(),PERIOD_H1,0)) 
      // ваши действия
}

bool CheckOpenBar(string sy="", int mn=-1, int tm=0) {
   int i, k=OrdersTotal();

   if (sy=="" || sy=="0") sy=Symbol();
   for (i=k-1; i>=0; i--) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         if (OrderSymbol()==sy) {
            if (mn<0 || OrderMagicNumber()==mn) {
               if (OrderType()<=OP_SELL) {
                  if (OrderOpenTime()<tm) return(false);
                  if (OrderOpenTime()==tm) return(true);
               }
            }
         }
      }
  }
  return(False);
}
 

У меня ошибка в коде есть. Если что, вечером исправлю

 

виносишь глобальную еременную Н (перед start )

if (Hour()!=H)
{
if(условие открытия)

{
ticket=OrderSend(Symbol(),OP_BUY,lot,Ask,3,Ask-400*Point,Ask+tp*Point);
H=Hour();
}

if(условие открытия)

{
ticket=OrderSend(Symbol(),OP_SELL,lot,Bid,3,Bid+400*Point,Bid-tp*Point);
H=Hour();

}
}

 
olltrad писал (а) >>

виносишь глобальную еременную Н (перед start )

if (Hour()!=H)
{
if(условие открытия)

{
ticket=OrderSend(Symbol(),OP_BUY,lot,Ask,3,Ask-400*Point,Ask+tp*Point);
H=Hour();
}

if(условие открытия)

{
ticket=OrderSend(Symbol(),OP_SELL,lot,Bid,3,Bid+400*Point,Bid-tp*Point);
H=Hour();

}
}

много благодарен за участие, но логику я представлял иначе - ведь в каждый час возможно открытие не более одной сделки. График - минутный.

bool _________________ = false // предполагаем, что ордер в текущий час ещё не открыт.

for(int i=OrdersTotal()-1; i>=0; i--) // цикл проверки всех ордеров

{

if __________________ //если открытый ордер не с текущего часа, то continue;

}

if_______________________ // если есть открытый ордер с текущего часа, выходим

break;

}

}

if ________________________ //если открытых ордеров нет, делаем проверку на открытие

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

 
olltrad писал (а) >>

виносишь глобальную еременную Н (перед start )

if (Hour()!=H)
{
if(условие открытия)

{
ticket=OrderSend(Symbol(),OP_BUY,lot,Ask,3,Ask-400*Point,Ask+tp*Point);
H=Hour();
}

if(условие открытия)

{
ticket=OrderSend(Symbol(),OP_SELL,lot,Bid,3,Bid+400*Point,Bid-tp*Point);
H=Hour();

}
}

Эх! olltrad ! Так подскажи уж до конца - в каком виде и месте эту глобальную переменную вносить в советник в моём первом посту?

 

Тебе же все равно сколько ордеров откроется, и как ты их будеш закрывать...

тогда в первоначальном варианте убери проверку кол ва ордеров =>( if(OrdersTotal()<1 )

и вместо указания часа пропиши минуты например:

  if(Minute()==1){//начало нового часа
   if(B100>=0.005){ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Ask-StopLoss*Point,Ask+TakeProfit*Point,0,0,0,Blue);}
   if( S100>=0.004){ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,Bid+StopLoss*Point,Bid-TakeProfit*Point,0,0,0,Red);}
    Sleep(3000);}//задержка на три минуты
 
xrust писал (а) >>

Тебе же все равно сколько ордеров откроется, и как ты их будеш закрывать...

тогда в первоначальном варианте убери проверку кол ва ордеров =>( if(OrdersTotal()<1 )

и вместо указания часа пропиши минуты например:

Дык, много орднров как раз не надо. В час не более одного на минутном графике. Olltrad вроде логичную подсказку дал: если текущий час не равен часу открытия, то отправляем на проверку условий. Далее запоминается час открытия. Тут всё понятно. Проблема с объявлением "Н" - наверно это OpenTradeTime? Или Н=0? Тогда как определить, что это именно час открытия сделки? Кому-то это элементарно, а кому-то

 
1854Crimea писал (а) >>

Эх! olltrad ! Так подскажи уж до конца - в каком виде и месте эту глобальную переменную вносить в советник в моём первом посту?

#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
extern int StopLoss=100;
extern int TakeProfit=40;
extern double Lots=1;
int ticket,H; //(например  здесь)
bool x;
double B100=0;
double S100=0;
int start()
{
if(Volume[0]>2)x=true;
B100=iMA(NULL,0,100,0,MODE_SMA,PRICE_TYPICAL,0)-Ask;
S100=Bid-iMA(NULL,0,100,0,MODE_SMA,PRICE_TYPICAL,0);



if(Volume[0]<3&&x)
x=false;

{
if( B100>=0.004 && Hour()==10&&Hour()!=H)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Ask-StopLoss*Point,Ask+TakeProfit*Point,0,0,0,Blue);
H=Hour(); // и так везде где посылка ордера
}
if( S100>=0.004 && Hour()==10 )
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,Bid+StopLoss*Point,Bid-TakeProfit*Point,0,0,0,Red);
} 
//---------------------------------------------------------------------
if(B100>=0.005 && Hour()==11)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Ask-StopLoss*Point,Ask+TakeProfit*Point,0,0,0,Blue);
}
if( S100>=0.005 && Hour()==11 )
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,Bid+StopLoss*Point,Bid-TakeProfit*Point,0,0,0,Red);
} 
//---------------------------------------------------------------------
if(B100>=0.006 && Hour()==12)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Ask-StopLoss*Point,Ask+TakeProfit*Point,0,0,0,Blue);
}
if( S100>=0.006 && Hour()==12)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,Bid+StopLoss*Point,Bid-TakeProfit*Point,0,0,0,Red);
} 

return(0);
}}
 
olltrad писал (а) >>

во время посылки ордера Н запоминает текущее время в виде простых чисел 10:01 это 10 20:35 это 20, тоесть если прошлая сделка была между 9:00 и 9:59 то следующая будет только в 10:00-10:59

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