如何了解市场是否关闭?(mql4) - 页 2

 
Alexey:

int Weekday = TimeDayOfWeek(TimeLocal());                                                          //Локальное время  |
int Weekdays = TimeDayOfWeek(TimeCurrent());                                                       //Серверное время  |

while(IsExpertEnabled())                                                                 //До тех пор пока запушенно  |

     {
     if(Weekday!=0||Weekday!=6){Exp=true;if(Weekday==1){Info(4,Weekday,0);}}       //Если не Сбб. Воск. то разрешено  |
     if(Weekdays==0||Weekdays==6)                                                  //Если Сбб. Воск. то не разрешено  |
       {
       Exp=false;Info(5,Weekdays,0);
       if(Weekdays==6){Sleep(86400000);}                                                //Если суббота пауза 24 часа  |
       if(Weekdays==0){Sleep(3600000);}                                               //Если воскресение пауза 1 час  |
       }

我大致是这样解决的,通过暂停和循环,但这是旧代码,在终端版本更新之前。现在有更简单的方法,你只需要稍微阅读一下文献。
当然,谢谢你,但就像他们说的,从一个地方的眼睛爬过去)我也可以在5.0的时候把欧元暂停,服务器让我这样做,然后随着每个定时器周期尝试改变暂停,如果错误132,那么市场被关闭,如果正常,那么交易是存在的,但在交易时间这个服务器淹没了,我想通过人力来解决问题,而不是通过 "循环",但这取决于MK开发人员。
 

允许贸易

返回有关使用专家顾问交易能力的信息。

boolIsTradeAllowed()。

该调用的第二种形式返回关于在指定时间对指定符号进行交易的能力的信息。

boolIsTradeAllowed(
const string symbol// symbol
datetimetested_time// 时间
);

参数

标志

[in] 符号。

测试时间

[在]时间。

返回的值

如果EA被允许进行交易且线程是空闲的,则返回true,否则返回false。

 
如果(SymbolInfoInteger(NULL,SYMBOL_TIME)>60) 返回(0)。
 
Kino:
当然,谢谢你,但就像他们说的从一个地方的眼睛进入)我也可以把欧元暂停在5.0服务器将允许它,然后与每个定时器周期尝试改变暂停,如果错误132 则市场关闭,如果正常则交易是,但在交易时间这个服务器被淹没,我想人性化地解决问题,而不是通过 "循环",但这是开发商MK。
需要申请交易许可。我的例子中没有这个要求,因为市场收盘时有三个小时的时间差,市场收盘前3个小时,基本都是平的。这就是为什么我在那里做得不同,但也有停顿,但间隔时间要小得多。
 
offfline:

允许贸易

返回有关使用专家顾问交易能力的信息。

boolIsTradeAllowed()。

该调用的第二种形式返回关于在指定时间对指定符号进行交易的能力的信息。

boolIsTradeAllowed(
const string symbol// symbol
datetimetested_time// 时间
);

参数

标志

[in] 符号。

测试时间

[在]时间。

返回的值

如果EA被允许进行交易,并且执行交易 的线程是空闲的,则返回true,否则返回false。

亚历山大,你错了)


//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);
      
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
  if (IsTradeAllowed() == True) Print("---- Ура торгуем -----");
   {
      int ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,0,0,"My order",16384,0,clrGreen);
      {
         if (ticket <0) Print("---- Уже не торгуем -----",GetLastError());
      }
   }

  }
//+------------------------------------------------------------------+
 

这个很好用

//+------------------------------------------------------------------+
//|                                                         тест.mq4 |
//|                                                   Sergey Gritcay |
//|                                               sergey1294@list.ru |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritcay"
#property link      "sergey1294@list.ru"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   if(isNewTime())
     {
      Print("---- Ура торгуем -----");
      int ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,0,0,"My order",16384,0,clrGreen);
        {
         if(ticket<0) Print("---- Уже не торгуем -----",GetLastError());
        }
     }
     else Print("---- функция isNewTime() = false, возможно торговля закрыта ");

  }
//+------------------------------------------------------------------+
bool isNewTime()
  {
//--- в статической переменной будем помнить время 
   static datetime last_time=0;
//--- текущее время
   datetime time=TimeCurrent();

//--- если это первый вызов функции
   if(last_time==0)
     {
      //--- установим время и выйдем 
      last_time=time;
      return(false);
     }

//--- если время отличается
   if(last_time!=time)
     {
      //--- запомним время и вернем true
      last_time=time;
      return(true);
     }
//--- дошли до этого места - значит время сервера не обновилось, вернем false
   return(false);
  }
 
sergey1294:

这个很好用

谢谢,我会试一试的。
 
Kino:
谢谢你的提示,但当市场开放时,试图确定用订单工作的可能性是不正确的,但它会起作用。

就我而言,我的推理如下。

如果有必要在当前的符号上进行交易,市场开放的一个间接标志是新刻度的到来。因此,OnTick事件已经足够了,这个问题已经结束。

如果我们需要处理当前符号以外的其他符号,在当前符号上开立交易的事实并不能保证交易在其他符号上执行。例如,专家顾问在欧元兑美元上运行,时间是09:00 UTC,而我们想交易美国股票,其市场将在13:00 UTC才开放。所以,OnTick不会有帮助。我们需要通过尝试在一定时间内向服务器发送订单,来确定市场是否由其他符号打开。每分钟发送一次订单决不是服务器轰炸,而是相当正常的做法。这有什么不对吗?

 

没有虱子就没有交易,因为服务人员曾经告诉我关于这个星期的问题。

他们提出了一个解决方案,比如。

TimeDayOfWeek(TimeLocal());

虽然这并不完全正确,因为一周的日子 可能与终端 不一样。

 
在最近的一个项目中,任务是检测一个任意符号的交易是否开放和可用的事实。
一个重要的条件是不要试图打开订单,尽管我在其他项目中曾多次诉诸于此。说实话,在我看来,这是迄今为止最简单、最可靠的方法。

到目前为止,我已经找到了最好的方法(但我仍在寻找,见下文)。
1)确定是否允许 "面对面 "交易--IsTradeAllowed()函数的第二种形式(上面已经描述过)。如果没有,那就不允许 :)
2) 用SymbolInfoInteger(<symbol>, SYMBOL_TIME)比较最后一次报价的时间和其中一个交易时段的时间(SymbolInfoSessionTrade()),如果报价的时间属于其中一个时段的范围,那么允许交易。
3) 检查报价的时间是否过于 "过时":如果超过xx分钟(比较SymbolInfoInteger(<symbol>, SYMBOL_TIME)和TimeCurrent(),那么我们认为该报价已经过时,因此,我们不能通过它进行交易(如果我是对的,大约是3分钟)。

这种方法的缺点是:可能有一些情况下,符号的交易是不可能的,而点子却能通过。
我没有进入这个机制;开发是为一个经纪人做的,在测试过程中,他们开启了这样的模式--刻度走了,但交易不可能。到目前为止,我们还没有设法克服这一变体。

可以说,我在实际交易中没有遇到过这种情况。因此,在 "正常 "条件下,该解决方案似乎可以容忍。但我仍在寻找它 :)

P.S.步骤1和2可以合并(将SymbolInfoInteger(<symbol>, SYMBOL_TIME)转移到函数IsTradeAllowed中),但我还没有对这种变体进行测试,所以不会这么说。

SymbolInfoSessionTrade - Документация на MQL4
  • docs.mql4.com
SymbolInfoSessionTrade - Документация на MQL4