我如何正确地开立市场订单? - 页 5

 
Gennady Mazur:

我最近提出了一个关于重开订单的话题。我以为我已经解决了这个问题,因为一个星期以来一切工作都非常顺利。但今天我遇到了一个类似的问题,只是在打开时。
在Finam上有很多订单,在Otkritie上有9个订单......尽管在所有情况下都应该只有一个订单开盘。

下面是EA的一个代码片断

    if(OpenOrders<1)
    {
        Coment="Open Sell "+string(OpenOrders+1);
        ret=OpenSellPosition(_Symbol,volume,Coment,Sleeppage,Filling);
    }
    
    
  if(ret)
  {
    OpenOrders++;
    PriceLastOpen=price;
  }

bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
  MqlTradeRequest Request;
  MqlTradeResult Results;
  ZeroMemory(Request);
  ZeroMemory(Results);
  Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
  Request.action=TRADE_ACTION_DEAL;
  Request.type=ORDER_TYPE_SELL;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);
  }
  return(false);
}

即我们可以从代码中看到,如果操作成功,变量OpenOrders 增加,最初等于0

如果它高于0,就不应该再开立订单,而是用注释Order1开立整堆的订单。

在打开订单 的函数中检查 是否有积极的回应,以及是否已经收到了订单票据,但由于某些原因,这个函数返回错误,尽管订单实际上已经设定。

解释一下问题出在哪里,如何解决这个问题?

此外,你可以通过尝试选择一个位置来检查其开盘情况。而且最好能多试几次。

         int n = 0;
          do
           {
            n++;
           }
          while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
既有延迟,也有确认立场已经到位的情况。

我还注意到,没有检查OrderCheck(Request, checkResult),这很糟糕。
 

哦,也是在市场秩序中--价格=0

Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); 忘了吧

bool SendOrderSyncMode()
  {
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
   order_ticket=0;
   request.action = TRADE_ACTION_DEAL;
   request.magic  = 9876543211;
   request.symbol = Symbol();
   request.volume = 1;
   request.price  = 0;
   request.type=ORDER_TYPE_BUY;
   request.comment="Sync mode";
   request.type_filling=ORDER_FILLING_FOK;
   request.type_time=ORDER_TIME_DAY;
   if(OrderSend(request,result))
     {
      if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED))
        {
         if(result.order>0)
           {
            order_ticket=result.order;
            Print(__FUNCTION__," Order sent in sync mode");
            return(true);
           }
         else
           {
            Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
           }
        }
      else
        {
         Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
        }
     }
   else
     {
      Print(__FUNCTION__," Order not sent in sync mode.");
     }
   return(false);
  }
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   switch(trans.type)
     {
      case TRADE_TRANSACTION_HISTORY_ADD:
        if((order_ticket > 0) && (trans.order == order_ticket))
      {
        //Вот здесь и смотрим что произошло
      }
      break;
     }
  }
 
Alexey Viktorov:
此外,还可以通过尝试选择来检查位置的开放。而且最好能多试几次

         int n = 0;
          do
           {
            n++;
           }
          while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
既有延迟,也有确认已经开仓的情况。

我还注意到,没有检查OrderCheck(Request, checkResult),这很糟糕。

如果这个职位已经存在了呢?

或者,如果已经有一个头寸,但订单没有被完全填满?

 
Alexey Viktorov:
此外,人们可以通过尝试选择来检查职位空缺。而几次的尝试都比较好。

         int n = 0;
          do
           {
            n++;
           }
          while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
既有延迟,也有确认,立场已经到位。

我还注意到,没有检查OrderCheck(Request, checkResult),这很糟糕。

好吧,也许我将插入OrderCheck(Request, checkResult)
谢谢

但我并不特别喜欢这样的循环

 
prostotrader:

哦,也是在市场秩序中--价格=0

Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); 忘了吧

bool SendOrderSyncMode()
  {
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
   order_ticket=0;
   request.action = TRADE_ACTION_DEAL;
   request.magic  = 9876543211;
   request.symbol = Symbol();
   request.volume = 1;
   request.price  = 0;
   request.type=ORDER_TYPE_BUY;
   request.comment="Sync mode";
   request.type_filling=ORDER_FILLING_FOK;
   request.type_time=ORDER_TIME_DAY;
   if(OrderSend(request,result))
     {
      if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED))
        {
         if(result.order>0)
           {
            order_ticket=result.order;
            Print(__FUNCTION__," Order sent in sync mode");
            return(true);
           }
         else
           {
            Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
           }
        }
      else
        {
         Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
        }
     }
   else
     {
      Print(__FUNCTION__," Order not sent in sync mode.");
     }
   return(false);
  }
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   switch(trans.type)
     {
      case TRADE_TRANSACTION_HISTORY_ADD:
        if((order_ticket > 0) && (trans.order == order_ticket))
      {
        //Вот здесь и смотрим что произошло
      }
      break;
     }
  }
非常感谢你如此详细的描述...和解释....。
关于价格....,是的,更习惯于MT4,在那里你总是要把价格...
 
Sergey Chalyshev:

重复进行

除此以外,你还应该检查订单的状态,以及它是否已经出现在历史上。

交易所不使用头寸,只使用订单。

真的吗?
 
Gennady Mazur:
如果我下的是挂单,你是对的,但我是按市场工作的,这里的票是用Results.deal 获得的。
还是先发送订单,然后再执行。
 
Sergey Chalyshev:

我不明白你的微笑是什么意思?

我没有想到会听到你这么说。什么停顿,还是你在开玩笑?

OrderSend() 之后暂停,以便可以更新市场信息和历史。
 
Sergey Chalyshev:

坏的外汇遗产。

...

你可能要小心你的措辞。否则,我们还不如谈论FOORTS信徒的基因变异。
 
Sergey Chalyshev:

如果这个职位已经存在了呢?

还是已经有了一个位置,但订单没有完全填满?

是的,而且我都是为了我的对冲。我承认我说得不太对。或者完全错误。:-)
原因: