请教大神,怎样才能规定时间内让EA只开一个单

 
举例来说,就是平了多单之后,之后的几小时之内不在自动开多单,过了规定时间之后才能再开多单。
 

在OnTradeTranscation找对最近的一张多单,获取开仓时间;

然后关掉自动交易,开仓时间+几小时后再重开自动交易

 

差不多是這樣的概念 你試試

input datetime OverTime = 60;


void OnTimer()

 {

   if(TimeCurrent()<LastOrderTime()+OverTime*60)

      return;

      

   OnTick();

 }

 

datetime LastOrderTime()

  {

   

   for(int i=0 ; i<=OrdersHistoryTotal() ; i++)

     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

       return(OrderCloseTime())

  

  }

 

这个函数可以返回某个货币符号最会一次关于某下单类型的平仓时间,当然你可以把关于symbol,orderType的的判断去掉。

下次开单时拿最新的时间减掉最后平仓时间,判断一下即可。


datetime getLatestClose(string symbol, ENUM_ORDER_TYPE orderType)

{

    ulong ret = 0;

    ulong ticket = 0;

    ulong order_ticket = 0;

    HistorySelect(TimeCurrent()-3600*2, TimeCurrent()); 

    int history = HistoryOrdersTotal();

    for(int i=history-1; i>=0;i--){

        order_ticket =  HistoryOrderGetTicket(i);

        ticket = HistoryOrderGetInteger(order_ticket,ORDER_POSITION_ID);

        if(order_ticket == ticket){

            continue;

        }

        ENUM_ORDER_TYPE type = (ENUM_ORDER_TYPE)HistoryOrderGetInteger(order_ticket,ORDER_TYPE);

        if(orderType == type){

            continue;

        }

        

        string tempSymbol = HistoryOrderGetString(order_ticket,ORDER_SYMBOL);

        if(StringCompare(symbol, tempSymbol, false)!=0){

            continue;

        }

        ret = (datetime)HistoryOrderGetInteger(order_ticket,ORDER_TIME_SETUP);

        break;

    }

    

    return ret;

 
xianglong bu:

这个函数可以返回某个货币符号最会一次关于某下单类型的平仓时间,当然你可以把关于symbol,orderType的的判断去掉。

下次开单时拿最新的时间减掉最后平仓时间,判断一下即可。


datetime getLatestClose(string symbol, ENUM_ORDER_TYPE orderType)

{

    ulong ret = 0;

    ulong ticket = 0;

    ulong order_ticket = 0;

    HistorySelect(TimeCurrent()-3600*2, TimeCurrent()); 

    int history = HistoryOrdersTotal();

    for(int i=history-1; i>=0;i--){

        order_ticket =  HistoryOrderGetTicket(i);

        ticket = HistoryOrderGetInteger(order_ticket,ORDER_POSITION_ID);

        if(order_ticket == ticket){

            continue;

        }

        ENUM_ORDER_TYPE type = (ENUM_ORDER_TYPE)HistoryOrderGetInteger(order_ticket,ORDER_TYPE);

        if(orderType == type){

            continue;

        }

        

        string tempSymbol = HistoryOrderGetString(order_ticket,ORDER_SYMBOL);

        if(StringCompare(symbol, tempSymbol, false)!=0){

            continue;

        }

        ret = (datetime)HistoryOrderGetInteger(order_ticket,ORDER_TIME_SETUP);

        break;

    }

    

    return ret;

这上面的代码全部直接复制到void OnTick() 里面吗?

不行啊, 出现错误啊

原因: