Почти решено :) Помогите с кодом. Маркет закрыт, а он пытается работать.

 

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

вроде проще некуда, о вот лыжи все равно не едут.

остались 2 ордера с Пт. и он пытается их юлозить сегодня в Сб..

помогите, что не так

//+------------------------------------------------------------------+
//|                                                        Hydra.mq4 |
//|                              Copyright 2016, Vladimir Gribachev. |
//|                      https://www.mql5.com/ru/users/moneystrategy |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Vladimir Gribachev."
#property link      "https://www.mql5.com/ru/users/moneystrategy"
#property version   "1.00"
#property strict
#define miz 0.00000001
//---
enum ENUM_EXECUTION
  {
   MarketExecution  = 1,
   InstantExecution = 2
  };
//---
enum ENUM_ORDERS
  {
   Stop  = 1,
   Limit = 2
  };
//---  
input ENUM_EXECUTION    Inp_OrderExecution    = InstantExecution;
input ENUM_ORDERS       Inp_OrderType         = Limit;
input double            Inp_StartLots         = 0.01;
input int               Inp_Slippage          = 99;
input int               Inp_Distance          = 100;
input int               Inp_Timer             = 15;
input int               Inp_StopLoss          = 999;
input int               Inp_TakeProfit        = 300;
input int               Inp_MagicNum          = 12345;
input int               Inp_MaxSpread         = 999;
input string            Inp_EaComment         = "EaComment ";


/*input*/ int                Inp_MaPeriod    = 55;
/*input*/ ENUM_MA_METHOD     Inp_MaMethod    = MODE_SMA;
/*input*/ ENUM_APPLIED_PRICE Inp_MaPrice     = PRICE_CLOSE;

bool Signal[2],sigN=true;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(!EventSetMillisecondTimer(100))
      Print("Cannot initialize timer");
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   EventKillTimer();
   if(DayOfWeek()!=0 && DayOfWeek()!=6)ClosePendingOrder();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(!IsTradeAllowed()||(DayOfWeek()==0 || DayOfWeek()==6))return;
   ModifyPendingOrders(Signal);
//---
   //HideTestIndicators(true);
   //double MA=NormalizeDouble(iMA(NULL,PERIOD_CURRENT,Inp_MaPeriod,0,Inp_MaMethod,Inp_MaPrice,0),_Digits);
   //HideTestIndicators(false);
//---
   double Lots,oop;
//double spread=NormalizeDouble((int)MarketInfo(_Symbol,MODE_SPREAD)*_Point,_Digits);
   int stoplevel=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)+(int)MarketInfo(_Symbol,MODE_STOPLEVEL)+(int)MarketInfo(_Symbol,MODE_SPREAD)*2;
   if(Inp_OrderType<2?CountSellStop()==0:CountBuyLimit()==0)
     {
      if(AccountInfoInteger(ACCOUNT_LIMIT_ORDERS)==0 || AccountInfoInteger(ACCOUNT_LIMIT_ORDERS)>CountOrders())
        {
         Lots=Inp_StartLots;
         if(Lots>SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX))Lots=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
         if(Lots<SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN))Lots=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
         Lots=NormalizeDouble(Lots,2);
         if(Inp_MaxSpread<(int)MarketInfo(_Symbol,MODE_SPREAD)){Print("Maximum spread is exceeded by ",(int)MarketInfo(_Symbol,MODE_SPREAD)-Inp_MaxSpread," point");return;}
         if((AccountFreeMarginCheck(Symbol(),Inp_OrderType<2?OP_SELL:OP_BUY,Lots)<=0 || GetLastError()==134) || CheckMoneyForTrade(_Symbol,Lots,Inp_OrderType<2?OP_SELL:OP_BUY)==false)
           {
            Print("Not enough money to open order sellstop ",Lots," lots. Maximum lot to open = ",MaxLot(Inp_OrderType<2?OP_SELL:OP_BUY));
            return;
           }
         oop=Inp_OrderType<2?NormalizeDouble(Bid-MathMax(Inp_Distance,stoplevel)*_Point,_Digits):NormalizeDouble(Ask-MathMax(Inp_Distance,stoplevel)*_Point,_Digits);
         if(Inp_OrderExecution==1)if(!OrderSend(_Symbol,Inp_OrderType<2?OP_SELLSTOP:OP_BUYLIMIT,Lots,oop,Inp_Slippage,0,0,Inp_EaComment,Inp_MagicNum,0,Inp_OrderType<2?clrRed:clrBlue))
            Print(__FUNCTION__," ",__LINE__," error: ",GetLastError());
         if(Inp_OrderExecution==2)if(!OrderSend(_Symbol,Inp_OrderType<2?OP_SELLSTOP:OP_BUYLIMIT,Lots,oop,Inp_Slippage,Inp_OrderType<2?NormalizeDouble(oop+MathMax(Inp_StopLoss,stoplevel)*_Point,_Digits):NormalizeDouble(oop-MathMax(Inp_StopLoss,stoplevel)*_Point,_Digits),Inp_OrderType<2?NormalizeDouble(oop-MathMax(Inp_TakeProfit,stoplevel)*_Point,_Digits):NormalizeDouble(oop+MathMax(Inp_TakeProfit,stoplevel)*_Point,_Digits),Inp_EaComment,Inp_MagicNum,0,Inp_OrderType<2?clrRed:clrBlue))
            Print(__FUNCTION__," ",__LINE__," error: ",GetLastError());
        }
      else
         Print("Reached the maximum allowed number of active pending orders");
     }
   if(Inp_OrderType<2?CountBuyStop()==0:CountSellLimit()==0)
     {
      if(AccountInfoInteger(ACCOUNT_LIMIT_ORDERS)==0 || AccountInfoInteger(ACCOUNT_LIMIT_ORDERS)>CountOrders())
        {
         Lots=Inp_StartLots;
         if(Lots>SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX))Lots=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
         if(Lots<SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN))Lots=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
         Lots=NormalizeDouble(Lots,2);
         if(Inp_MaxSpread<(int)MarketInfo(_Symbol,MODE_SPREAD)){Print("Maximum spread is exceeded by ",(int)MarketInfo(_Symbol,MODE_SPREAD)-Inp_MaxSpread," point");return;}
         if((AccountFreeMarginCheck(Symbol(),Inp_OrderType<2?OP_BUY:OP_SELL,Lots)<=0 || GetLastError()==134) || CheckMoneyForTrade(_Symbol,Lots,Inp_OrderType<2?OP_BUY:OP_SELL)==false)
           {
            Print("Not enough money to open order buystop ",Lots," lots. Maximum lot to open = ",MaxLot(Inp_OrderType<2?OP_BUY:OP_SELL));
            return;
           }
         oop=Inp_OrderType<2?NormalizeDouble(Ask+MathMax(Inp_Distance,stoplevel)*_Point,_Digits):NormalizeDouble(Bid+MathMax(Inp_Distance,stoplevel)*_Point,_Digits);
         if(Inp_OrderExecution==1)if(!OrderSend(_Symbol,Inp_OrderType<2?OP_BUYSTOP:OP_SELLLIMIT,Lots,oop,Inp_Slippage,0,0,Inp_EaComment,Inp_MagicNum,0,Inp_OrderType<2?clrBlue:clrRed))
            Print(__FUNCTION__," ",__LINE__," error: ",GetLastError());
         if(Inp_OrderExecution==2)if(!OrderSend(_Symbol,Inp_OrderType<2?OP_BUYSTOP:OP_SELLLIMIT,Lots,oop,Inp_Slippage,Inp_OrderType<2?NormalizeDouble(oop-MathMax(Inp_StopLoss,stoplevel)*_Point,_Digits):NormalizeDouble(oop+MathMax(Inp_StopLoss,stoplevel)*_Point,_Digits),Inp_OrderType<2?NormalizeDouble(oop+MathMax(Inp_TakeProfit,stoplevel)*_Point,_Digits):NormalizeDouble(oop-MathMax(Inp_TakeProfit,stoplevel)*_Point,_Digits),Inp_EaComment,Inp_MagicNum,0,Inp_OrderType<2?clrBlue:clrRed))
            Print(__FUNCTION__," ",__LINE__," error: ",GetLastError());
        }
      else
         Print("Reached the maximum allowed number of active pending orders");
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(IsTradeAllowed() && (DayOfWeek()!=0 && DayOfWeek()!=6))
     {
      ModifyPendingOrders(Signal);
      static int sec;
      sec++;
      if(sec>=1)
        {
         sigN=true;
         sec=0;
         OnTick();
        }
     }
  }
//+------------------------------------------------------------------+
void ModifyPendingOrders(bool &ar[])
  {
   if(!IsTradeAllowed() || (DayOfWeek()==0 || DayOfWeek()==6))return;
   double prup=0,prdn=0,oop;
   static int sec;
   int stoplevel=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)+(int)MarketInfo(_Symbol,MODE_STOPLEVEL)+(int)MarketInfo(_Symbol,MODE_SPREAD)*2;
//double spread=NormalizeDouble((int)MarketInfo(_Symbol,MODE_SPREAD)*_Point,_Digits);
   if(sec<0)
     {
      double up=Ask;
      double dn=Bid;
      if((up>0.0 && !(up-Ask>miz)) || (dn>0.0 && !(Bid-dn>miz)))
        {
         sec=Inp_Timer*60;
         ArrayInitialize(ar,false);
        }
     }
   if(sec==0)
     {
      prup=Ask;
      prdn=Bid;
      ArrayInitialize(ar,true);
      for(int i=0; i<OrdersTotal(); i++)
        {
         if(OrderSelect(i,SELECT_BY_POS)==true)
           {
            if(OrderSymbol()==_Symbol && (OrderMagicNumber()==Inp_MagicNum || Inp_MagicNum==-1))
              {
               if(OrderType()==(Inp_OrderType<2?OP_BUYSTOP:OP_SELLLIMIT))
                 {
                  oop=Inp_OrderType<2?NormalizeDouble(Ask+MathMax(Inp_Distance,stoplevel)*_Point,_Digits):NormalizeDouble(Bid+MathMax(Inp_Distance,stoplevel)*_Point,_Digits);
                  if(OrderOpenPrice()!=oop && OrderTakeProfit()!=(Inp_OrderType<2?NormalizeDouble(oop+MathMax(Inp_TakeProfit,stoplevel)*_Point,_Digits):NormalizeDouble(oop-MathMax(Inp_TakeProfit,stoplevel)*_Point,_Digits)) && OrderStopLoss()!=(Inp_OrderType<2?NormalizeDouble(oop-MathMax(Inp_StopLoss,stoplevel)*_Point,_Digits):NormalizeDouble(oop+MathMax(Inp_StopLoss,stoplevel)*_Point,_Digits)))
                    {
                     if(Inp_OrderExecution==1)if(!OrderModify(OrderTicket(),oop,OrderStopLoss(),OrderTakeProfit(),OrderExpiration(),Inp_OrderType<2?clrBlue:clrRed))
                       {Print(__FUNCTION__," ",__LINE__," error: ",GetLastError());}else ar[0]=true;ar[1]=false;
                     if(Inp_OrderExecution==2)if(!OrderModify(OrderTicket(),oop,Inp_OrderType<2?NormalizeDouble(oop-MathMax(Inp_StopLoss,stoplevel)*_Point,_Digits):NormalizeDouble(oop+MathMax(Inp_StopLoss,stoplevel)*_Point,_Digits),Inp_OrderType<2?NormalizeDouble(oop+MathMax(Inp_TakeProfit,stoplevel)*_Point,_Digits):NormalizeDouble(oop-MathMax(Inp_TakeProfit,stoplevel)*_Point,_Digits),OrderExpiration(),Inp_OrderType<2?clrBlue:clrRed))
                       {Print(__FUNCTION__," ",__LINE__," error: ",GetLastError());}else ar[0]=true;ar[1]=false;
                    }
                 }
               if(OrderType()==(Inp_OrderType<2?OP_SELLSTOP:OP_BUYLIMIT))
                 {
                  oop=Inp_OrderType<2?NormalizeDouble(Bid-MathMax(Inp_Distance,stoplevel)*_Point,_Digits):NormalizeDouble(Ask-MathMax(Inp_Distance,stoplevel)*_Point,_Digits);
                  if(OrderOpenPrice()!=oop && OrderTakeProfit()!=(Inp_OrderType<2?NormalizeDouble(oop-MathMax(Inp_TakeProfit,stoplevel)*_Point,_Digits):NormalizeDouble(oop+MathMax(Inp_TakeProfit,stoplevel)*_Point,_Digits)) && OrderStopLoss()!=(Inp_OrderType<2?NormalizeDouble(oop+MathMax(Inp_StopLoss,stoplevel)*_Point,_Digits):NormalizeDouble(oop-MathMax(Inp_StopLoss,stoplevel)*_Point,_Digits)))
                    {
                     if(Inp_OrderExecution==1)if(!OrderModify(OrderTicket(),oop,OrderStopLoss(),OrderTakeProfit(),OrderExpiration(),Inp_OrderType<2?clrRed:clrBlue))
                       {Print(__FUNCTION__," ",__LINE__," error: ",GetLastError());}else ar[1]=true;ar[0]=false;
                     if(Inp_OrderExecution==2)if(!OrderModify(OrderTicket(),oop,Inp_OrderType<2?NormalizeDouble(oop+MathMax(Inp_StopLoss,stoplevel)*_Point,_Digits):NormalizeDouble(oop-MathMax(Inp_StopLoss,stoplevel)*_Point,_Digits),Inp_OrderType<2?NormalizeDouble(oop-MathMax(Inp_TakeProfit,stoplevel)*_Point,_Digits):NormalizeDouble(oop+MathMax(Inp_TakeProfit,stoplevel)*_Point,_Digits),OrderExpiration(),Inp_OrderType<2?clrRed:clrBlue))
                       {Print(__FUNCTION__," ",__LINE__," error: ",GetLastError());}else ar[1]=true;ar[0]=false;
                    }
                 }
              }
           }
        }
     }
   sec--;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double MaxLot(int cmd)
  {
   double result=0;
   double lotStep=MarketInfo(_Symbol,MODE_LOTSTEP);
   double v=MarketInfo(_Symbol,MODE_MINLOT);
   double mult=100;
   while(true)
     {
      if(AccountFreeMarginCheck(_Symbol,cmd,v+lotStep*mult)>0)
        {
         v=v+lotStep*mult;
        }
      else
        {
         mult=mult/10;
         if(mult<1)
           {
            if(AccountFreeMarginCheck(_Symbol,cmd,v)>0)
              {
               result=v;
              }
            break;
           }
        }
     }
   return(result);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CheckMoneyForTrade(string symb,double lots,int type)
  {
   double free_margin=AccountFreeMarginCheck(symb,type,lots);
   if(free_margin<0)
     {
      string oper=(type==OP_BUY)? "Buy":"Sell";
      Print("Not enough money for ",oper," ",lots," ",symb," Error code=",GetLastError());
      return(false);
     }
   return(true);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountOrders()
  {
   int count = 0;
   for(int i = OrdersTotal()-1; i>=0; i --)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol && (OrderMagicNumber()==Inp_MagicNum || Inp_MagicNum==-1))
            count++;
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountSellStop()
  {
   int count = 0;
   for(int i = OrdersTotal()-1; i>=0; i --)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol && (OrderMagicNumber()==Inp_MagicNum || Inp_MagicNum==-1))
           {
            if(OrderType()==OP_SELLSTOP)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountBuyStop()
  {
   int count = 0;
   for(int i = OrdersTotal()-1; i>=0; i --)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol && (OrderMagicNumber()==Inp_MagicNum || Inp_MagicNum==-1))
           {
            if(OrderType()==OP_BUYSTOP)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountSellLimit()
  {
   int count = 0;
   for(int i = OrdersTotal()-1; i>=0; i --)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol && (OrderMagicNumber()==Inp_MagicNum || Inp_MagicNum==-1))
           {
            if(OrderType()==OP_SELLLIMIT)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountBuyLimit()
  {
   int count = 0;
   for(int i = OrdersTotal()-1; i>=0; i --)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol && (OrderMagicNumber()==Inp_MagicNum || Inp_MagicNum==-1))
           {
            if(OrderType()==OP_BUYLIMIT)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ClosePendingOrder()
  {
   int total = OrdersTotal() - 1;
   for(int i = total; i >= 0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol && (OrderMagicNumber()==Inp_MagicNum || Inp_MagicNum==-1))
           {
            if(OrderType() == OP_BUYSTOP)if(!OrderDelete(OrderTicket(),clrBlue))Print(__FUNCTION__," ",__LINE__," error: ",GetLastError());
            if(OrderType() == OP_SELLSTOP)if(!OrderDelete(OrderTicket(),clrRed))Print(__FUNCTION__," ",__LINE__," error: ",GetLastError());
            if(OrderType() == OP_BUYLIMIT)if(!OrderDelete(OrderTicket(),clrBlue))Print(__FUNCTION__," ",__LINE__," error: ",GetLastError());
            if(OrderType() == OP_SELLLIMIT)if(!OrderDelete(OrderTicket(),clrRed))Print(__FUNCTION__," ",__LINE__," error: ",GetLastError());
           }
        }
     }
  }
//+------------------------------------------------------------------+
 
Vladimir Gribachev:

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

вроде проще некуда, о вот лыжи все равно не едут.

остались 2 ордера с Пт. и он пытается их юлозить сегодня в Сб..

помогите, что не так

Вот пример кода, взятый из советника AffterEffects, который справляется с такой проблемой:

if(IsTradeAllowed()) // Если торговля разрешена
     {
      RefreshRates(); // Обновляем информацию с сервера
      ... // Реагируем на разрешение торговли
     }
   else
     {
      ... // Реагируем на запрет торговли
      return(0); // Выходим
     }

 

DayOfWeek возвращает день серверного времени. Т.е. пятницу.

https://docs.mql4.com/ru/dateandtime/dayofweek

 

Вам надо TimeLocal() через TimeToStruct() разложить и оттуда уже день недели для проверки брать. 

DayOfWeek - Дата и время - Справочник MQL4
DayOfWeek - Дата и время - Справочник MQL4
  • docs.mql4.com
DayOfWeek - Дата и время - Справочник MQL4
 

Попробуй применить TimeLocal()  к TimeDayOfWeek() вместо DayOfWeek().

Или так, как выше подсказали уже. 

 
Бывают ситуации, когда советник в пятницу вошёл в функцию модификации или открытия позиции, но за время её выполнения маркет закрылся. Он будет висеть внутри этой функции и пытаться долбить закрытый рынок. Вам нужно перед самой отсылкой приказа на сервер проверить условия для выхода из функции. У меня всё происходит в цикле - количество торговых запросов, так вот в цикле перед отправкой приказа, делается проверка и, если нельзя отсылать приказ, то break; и выход в итоге из функции с кодом возврата о запрете торговли. Советник анализирует код возврата и больше не пытается вызывать эту функцию, а выходит из торгового блока с ожиданием нового сигнала, который уже не поступит пока рынок не будет открыт.
 
DayOfWeek работает от последнего времени сервера или времени тика, последний тик пришел в пятницу и функция зависла на пятнице
 
Andrey Barinov:

DayOfWeek возвращает день серверного времени. Т.е. пятницу.

https://docs.mql4.com/ru/dateandtime/dayofweek

Вам надо TimeLocal() через TimeToStruct() разложить и оттуда уже день недели для проверки брать. 

Типа так?

MqlDateTime day;
   TimeToStruct(TimeLocal(),day);

Сейчас в код запилю и проверю.

 
Vladimir Gribachev:

Типа так?

MqlDateTime day;
TimeToStruct(TimeLocal(),day);   

Сейчас в код запилю и проверю.

наверное,типа так

struct MqlDateTime
  {
   int year;           // год
   int mon;            // месяц
   int day;            // день
   int hour;           // час
   int min;            // минуты
   int sec;            // секунды
   int day_of_week;    // день недели (0-воскресенье, 1-понедельник, ... ,6-суббота)
   int day_of_year;    // порядковый номер в году (1 января имеет номер 0)
  };

 
ivanivan_11:

наверное,типа так

struct MqlDateTime
  {
   int year;           // год
   int mon;            // месяц
   int day;            // день
   int hour;           // час
   int min;            // минуты
   int sec;            // секунды
   int day_of_week;    // день недели (0-воскресенье, 1-понедельник, ... ,6-суббота)
   int day_of_year;    // порядковый номер в году (1 января имеет номер 0)
  };

я это имел ввиду...
MqlDateTime day;
   TimeToStruct(TimeLocal(),day);    
   if(!IsTradeAllowed()||(day.day_of_week==0 || day.day_of_week==6))return;

 
Andrey Barinov:

Вам надо TimeLocal() через TimeToStruct() разложить и оттуда уже день недели для проверки брать. 

Спасибо Вам, теперь вроде все нормально пашет.
 
время сервера может не совпадать с локальным временем
Причина обращения: