Памагитя...

 

Привет, я пытался написать эксперт который проверяет пересекал ли Momentum уровень 100 и если пересекал, то открывал позицию в противоположном направлении и закрывал бы ордер в 23.40, ну или чуть позже. В принципе со входом всё в порядке открывает вовремя и правильно, вот тока почему то закрывать в конце дня не хочет, а закрывает тока по T/P или S/L

extern double TakeProfit = 300;
extern double Lots = 0.1;
extern int period=14;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double MOMENTUM1,MOMENTUM2;
   int cnt, ticket, total;

  
   MOMENTUM1 = Close[1] / Close[1 + period] * 100;
   MOMENTUM2 = Close[2] / Close[2 + period] * 100;
  
   total=OrdersTotal();
   if(total<1)//проверка количества ордеров 
     {
      // проверка свободных средств
      if(AccountFreeMargin()<(1000*Lots))//количество свободных средств
        {
         Print("Недостаточно средств = ", AccountFreeMargin());
         return(0);  
        }
      // открытие длинной позиции
      if(MOMENTUM2<100 && MOMENTUM1>100 && Close[1]<Close[2] && TimeMinute(TimeCurrent()) < 40) 
        {
         RefreshRates();
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"-",0,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("открыта позиция BUY : ",OrderOpenPrice());
           }
         else Print("Ошибка при открытии BUY позиции : ",GetLastError()); 
         return(0);
        }
      // открытие короткой позиции
      if(MOMENTUM1<100 && MOMENTUM2>100 && Close[2]<Close[1] && TimeMinute(TimeCurrent()) < 40)
        {
        RefreshRates();
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"-",0,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("открыта позиция SELL : ",OrderOpenPrice());
           }
         else Print("Ошибка при открытии SELL позиции : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
   // условия закрытия ордеров   
  
    
    
    
   
   if(ticket !=0 && TimeHour(TimeCurrent()) == 23 && TimeMinute(TimeCurrent()) > 40 ) //проверка количества ордеров   
     {
      OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
                 RefreshRates();
                 OrderClose(ticket,OrderLots(),Bid,3,Violet);
                 ticket=0;
                 return(0);
                }
        }
   return(0);
 

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

- проверить время, если пора, то...

- проверить наличие открытых ордеров, если есть, то ...

- проверить что там за ордер бай или селл, а заодно выцепить его номер

- попытаться закрыть ордер по правильной цене (для покупки и продажи они разные)

 
Lameruga писал(а) >>

Привет, я пытался написать эксперт который проверяет пересекал ли Momentum уровень 100 и если пересекал, то открывал позицию в противоположном направлении и закрывал бы ордер в 23.40, ну или чуть позже. В принципе со входом всё в порядке открывает вовремя и правильно, вот тока почему то закрывать в конце дня не хочет, а закрывает тока по T/P или S/L

У Вас в выражении

if(ticket !=0 && TimeHour(TimeCurrent()) == 23 && TimeMinute(TimeCurrent()) > 40 ) //проверка количества ордеров  
ticket всегда равен 0. Надо перед этим выбрать ордер. Как то так:
for(int i=0;i<OrdersTotal();i++) {
   bool flag=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
   if(flag && TimeHour(TimeCurrent()) == 23 && TimeMinute(TimeCurrent()) > 40 ) {
      RefreshRates();
      if(OrderType()==OP_BUY) double CurPrice=NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS));
      if(OrderType()==OP_SELL) CurPrice=NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS));
         
      OrderClose(OrderTicket(),OrderLots(),CurPrice,3,Violet);
   }
}
З.Ы. timbo все правильно написал, не будет не нужных проверок.
 
 
буду пытаться, просто изначально это был вообще советник на МАСД, наглым образом искажённый мной, под работу с моментумом...
 
О_о крыша едет не спеша, выставил использовать дату на 2005г., так этот приколист три сделки в 2001 и 2002г. сделал
 
   if(ticket !=0 && TimeHour(TimeCurrent()) == 23 && TimeMinute(TimeCurrent()) > 40 ) //проверка количества ордеров   
     {
      OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
                 RefreshRates();
                 OrderClose(ticket,OrderLots(),Bid,3,Violet);
                 ticket=0;
                 return(0);
                }

Вот это надо выбросить.

И написать вот это. Это закроет все открытые ордера, если в промежутке времени между 23:40 и 24:00 будет хоть 1 тик.

if(TimeHour(TimeCurrent())==23 && TimeMinute(TimeCurrent())>40)
   {
   for (int i=1; i<=OrdersTotal(); i++)                                                        
      {                                                                                                                                             
      if(OrderSelect(i-1,SELECT_BY_POS)==true)
         {
         OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,Violet);
         }
      }
   }
 
STill_ace >>:

Вот это надо выбросить.

И написать вот это. Это закроет все открытые ордера, если в промежутке времени между 23:40 и 24:00 будет хоть 1 тик.

Этот код закроет только каждый второй открытый ордер. Перебор ордеров надо делать начиная с последнего.  

И ещё выдаст кучу error messages, если, например, открытых ордеров нет.

 
STill_ace писал(а) >>

Вот это надо выбросить.

И написать вот это. Это закроет все открытые ордера, если в промежутке времени между 23:40 и 24:00 будет хоть 1 тик.

Сколько раз писали, что закрывать толпу ордеров надо в обратном порядке. У Вас закроет через один.

Извиняюсь, опоздал с ответом.

 
спасибо за советы на следующих выходных буду мучать эксперта дальше