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

 

我最近提出了一个关于重开订单的话题。我以为我已经解决了这个问题,因为一个星期以来一切工作都非常顺利。但今天我遇到了一个类似的问题,只是在打开时。
在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开立整堆的订单。

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

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

 
我想,关于交易的信息还没有到来。这里(用红色 标出)你是在依靠运气。她是一位任性的女士 :-))

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);
}
 
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开立整堆的订单。

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

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

坏的外汇遗产。

你应该检查结果。秩序。

如果下了订单,这并不意味着交易已经完成。

 
Sergey Chalyshev:

坏的外汇遗产。

我们必须去看看秩序。

如果下了订单,这并不意味着交易已经被执行。

如果我下的是挂单,你是对的,但我是按市场工作的,这里的票是用Results.deal 获得的。
 
Dennis Kirichenko:
我想,关于交易的信息还没有到来。这里(用红色 标出)你是在依靠运气。她是一位任性的女士 :-))

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);
}
不,这个结果是存在的,这不是服务器上的票据订单,这是一个临时的票据操作,以后会被票据位置所取代
 
Dennis Kirichenko:
我想,关于交易的信息还没有到来。这里(用红色 标出)你是在依靠运气。她是一位任性的女士 :-))

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);
}
在以前的一个主题中,我得到了保证,这个论坛的大师,这个信息总是来......几乎是即时的......如果服务器积极响应,票据没有发出,订单就会失败
 

你需要记录所有的交易。例如,像这样。

首先,在 "头 "中,我们连接CTrade交易类。

#include <Trade\Trade.mqh>
CTrade         m_trade;                      // trading object

而这里是一个购买操作的例子。

   if(m_trade.Buy(lots,NULL,m_symbol.Ask(),sl,tp))
     {
      if(m_trade.ResultDeal()==0)
         Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());

      else
         Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());
     }
   else
      Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
            ", description of result: ",m_trade.ResultRetcodeDescription());

所以你可以得到两个错误:第一层--操作没有通过基本检查第二层--交易票据的检查

然后,如果有问题,你可以用日志来找出问题。

补充:以上是对SYNC操作模式的真实情况。

 

现在,这里的大师们也会教你))。

Объясните что не так, как решить данную проблему? 

以你的经验,在这里问这种问题是不体面的。

 
Vladimir Karputov:

你需要记录所有的交易。例如,像这样。

首先,在 "头 "中,我们连接CTrade交易类。

#include <Trade\Trade.mqh>
CTrade         m_trade;                      // trading object

而这里是一个购买操作的例子。

   if(m_trade.Buy(lots,NULL,m_symbol.Ask(),sl,tp))
     {
      if(m_trade.ResultDeal()==0)
         Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());

      else
         Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());
     }
   else
      Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
            ", description of result: ",m_trade.ResultRetcodeDescription());

所以你可以得到两个错误:第一层--操作没有通过基本检查第二层--交易票据的检查

然后,如果有问题,你可以用日志来找出问题。

补充:以上是对SYNC操作模式的真实情况。

这正是我的做法。

  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);
  }
  return(false);
只能用我自己的代码
 
Vladimir Karputov:

你需要记录所有的交易。例如,像这样。

首先,在 "头 "中,我们连接CTrade交易类。

#include <Trade\Trade.mqh>
CTrade         m_trade;                      // trading object

而这里是一个购买操作的例子。

   if(m_trade.Buy(lots,NULL,m_symbol.Ask(),sl,tp))
     {
      if(m_trade.ResultDeal()==0)
         Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());

      else
         Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());
     }
   else
      Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
            ", description of result: ",m_trade.ResultRetcodeDescription());

所以你可以得到两个错误:第一层--操作没有通过基本检查第二层--交易票据的检查

然后,如果有问题,你可以用日志来找出问题。

补充:以上是对SYNC操作模式的真实情况。

哦,还有一件事,标准功能是否支持订单的执行,他们的备案,因为我曾经使用SeaTrade进行开盘,直到我到了一个交易所,订单不想被执行,因为无法确定备案
 
Gennady Mazur:
这正是我所做的

  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);
  }
  return(false);
但是用我自己的代码。
伐木的事呢?你必须同时输出操作的成功完成,特别是输出带有错误代码 的失败。
原因: