MQL4 - 每天一个订单

MQL4 - one order per day

我想写一个布尔值 returns false 如果最后一个订单 (close) 已经执行了不到 24 小时。

我尝试使用此代码,但它总是 returns false:

bool OnePerDay()
{
     if (  OrderSelect( 1, SELECT_BY_POS, MODE_HISTORY ) )
     {     

           if (  OrderOpenTime() <  24*60*60 ) return( true );
     }
     return( false );
}

我的目标是每天(或其他时间间隔)至少执行一笔交易,因此应该开仓和平仓,但在之后不到 24 小时内不执行其他订单。

OrderOpenTime() 是一个 datetime 变量,这意味着它是大于零且小于 2^31-1 的整数,表示自 1970 年 1 月 1 日以来的秒数。例如,它是 9:20:07 am UTC 2017 年 10 月 14 日,即 datetime 格式的 1507972807。如果您想检查交易是今天还是更早开始,您需要知道今天日期的开始时间,例如iTime(_Symbol(),PERIOD_D1,0)TimeCurrent()/(24*60*60)*(24*60*60) 即 1507939200。如果您需要检查交易持续时间是否少于 24 小时 - TimeCurrent()-OrderOpenTime() 与 24*60*60 进行比较或获取预期时间=23=] true 并与该日期进行比较。此外,您还需要考虑周五开放订单但现在是周一的情况(所以超过 24 小时,但您的任务可以吗?)

一共:

const int DAY_SECONDS = 24*60*60;
bool isTradeOpenToday(int ticket){//true means trade lasts less then 24h
   datetime now = TimeCurrent();
   datetime now_minus_24h = now - DAY_SECONDS;
   if(OrderSelect(ticket,SELECT_BY_TICKET)){
      return now_minus_24h - OrderOpenTime() < 0;
   }
}

如何扫描db.POOL

#define aTimeLAST iTime( _Symbol, PERIOD_H1, 23 )  // 24 H1 Bars back at Market
     // aTimeLAST  Time() - 24*60*60               // 24 hours since this Bar

void OnTick(){

     if   WasNoTradeWithinLAST( aTimeLAST ) {
          ...
     }
}

bool WasNoTradeWithinLAST( const datetime aClosestAllowedTIME ) {

     for (  int anOrdinalNUM  = 0;
                anOrdinalNUM <  OrdersTotal();
                anOrdinalNUM++
                ) {
            if ( !OrderSelect( anOrdinalNUM; SELECT_BY_POS; MODE_HISTORY ){
                  PrintFormat( "OrderSelect( %d ) failed. Will continue.", anOrdinalNUM );
            }
            else {

                  if (  OrderCloseTime() >= aClosestAllowedTIME
                     || OrderOpenTime()  >= aClosestAllowedTIME
                        )
                        return( false ); // WELL, XTO WAS WITHIN LAST 24HRS
            }
     }
     return( true );  // NONE XTO HAS BEEN PERFORMED DURING LAST 24HRS
 }

找到了写出 bool 函数的方法,请阅读定义的评论。

解决方法是在订单select的for循环中正确枚举平仓单,所以这个booleanreturn只有在最后一个平仓单执行时间超过24时才为真小时前。

int orhito () { return OrdersHistoryTotal(); } // number of closed  orders
int orto () {   return OrdersTotal();        } // number of pending orders

//+------------------------------------------------------------------+
bool onePerTime() { /* boolean that should return true
                               if the last close order
                               was performed more than 24 hours before */

     if (  orhito() == 0 ) return ( true );
     else{
           for ( int i = orhito(); i >= 0 ; i-- ) { 
                 if (  OrderSelect( i, SELECT_BY_POS, MODE_HISTORY ) ) { 
                       if (  TimeCurrent() - OrderCloseTime()  < 24*60*60 )
                             return( false );
                 } 
           }
           return( true );
     }
}