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 );
}
}
我想写一个布尔值 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 );
}
}