#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();
}
}
много благодарен за участие, но логику я представлял иначе - ведь в каждый час возможно открытие не более одной сделки. График - минутный.
bool _________________ = false // предполагаем, что ордер в текущий час ещё не открыт.
for(int i=OrdersTotal()-1; i>=0; i--) // цикл проверки всех ордеров
{
if __________________ //если открытый ордер не с текущего часа, то continue;
}
if_______________________ // если есть открытый ордер с текущего часа, выходим
break;
}
}
if ________________________ //если открытых ордеров нет, делаем проверку на открытие
Небольшая просьба желающим помочь - максимальное число комментариев и доработанную часть полностью вставить в исходный советник из моего первого поста и сделать в нём все необходимые изменения. Не силён я программист, увы.
виносишь глобальную еременную Н (перед 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);}//задержка на три минуты
Тебе же все равно сколько ордеров откроется, и как ты их будеш закрывать...
тогда в первоначальном варианте убери проверку кол ва ордеров =>( if(OrdersTotal()<1 )
и вместо указания часа пропиши минуты например:
Дык, много орднров как раз не надо. В час не более одного на минутном графике. Olltrad вроде логичную подсказку дал: если текущий час не равен часу открытия, то отправляем на проверку условий. Далее запоминается час открытия. Тут всё понятно. Проблема с объявлением "Н" - наверно это OpenTradeTime? Или Н=0? Тогда как определить, что это именно час открытия сделки? Кому-то это элементарно, а кому-то
Эх! 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); }}
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Как дать возможность этому советнику открывать по одной сделке каждый следующий час, а не всего одну сделку?
Чем надо заменить 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);
}}