Проблема в том, что уже прописал условия если день не Сб. и не Вс. и торговля разрешена то работаем, а нет то не работаем.
вроде проще некуда, о вот лыжи все равно не едут.
остались 2 ордера с Пт. и он пытается их юлозить сегодня в Сб..
помогите, что не так
Вот пример кода, взятый из советника AffterEffects, который справляется с такой проблемой:
{
RefreshRates(); // Обновляем информацию с сервера
... // Реагируем на разрешение торговли
}
else
{
... // Реагируем на запрет торговли
return(0); // Выходим
}
DayOfWeek возвращает день серверного времени. Т.е. пятницу.
https://docs.mql4.com/ru/dateandtime/dayofweek
Вам надо TimeLocal() через TimeToStruct() разложить и оттуда уже день недели для проверки брать.
![DayOfWeek - Дата и время - Справочник MQL4 DayOfWeek - Дата и время - Справочник MQL4](https://c.mql5.com/36/10/dayofweek-data-i-vremya-spravochnik.png)
Попробуй применить TimeLocal() к TimeDayOfWeek() вместо DayOfWeek().
Или так, как выше подсказали уже.
DayOfWeek возвращает день серверного времени. Т.е. пятницу.
https://docs.mql4.com/ru/dateandtime/dayofweek
Вам надо TimeLocal() через TimeToStruct() разложить и оттуда уже день недели для проверки брать.
Типа так?
TimeToStruct(TimeLocal(),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)
};
наверное,типа так
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)
};
TimeToStruct(TimeLocal(),day);
if(!IsTradeAllowed()||(day.day_of_week==0 || day.day_of_week==6))return;
Вам надо TimeLocal() через TimeToStruct() разложить и оттуда уже день недели для проверки брать.
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Проблема в том, что уже прописал условия если день не Сб. и не Вс. и торговля разрешена то работаем, а нет то не работаем.
вроде проще некуда, о вот лыжи все равно не едут.
остались 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());
}
}
}
}
//+------------------------------------------------------------------+