错误、漏洞、问题 - 页 803

 
Karlson:
不同的服务器,不同的500页。
这与不同的服务器有什么关系?这是同一个人的两次测试。只有在测试器中指定的货币对不同
 
ilunga:
这与不同的服务器有什么关系?这是同一个人的两次测试。只有在测试器中指定的货币对不同
更新你的终端/测试器,也许一切都会工作,我有687的构建,一切都能工作。
 
fyords:

我有一切正确的东西,演示MK服务器。

那么请解释一下,当你开立一个订单时,括号里的数值是多少,为什么在一种情况下是(1.29565 / 1.29654),而在另一种情况下是(1.29443 / 1.29479 / 1.29443)?

(我是指你的测试结果)。

fyords:
更新你的终端/测试器,也许一切都会工作,我有一个687的构建,一切都能工作。

在将EA发送给冠军时(在他们的自动测试中)"弹出 "了完全相同的错误,所以更新只能提供部分帮助。


更重要的是。它只出现过一次(第一次尝试在 "你的 "以外的货币对上下单)。

 
ilunga:
这与不同的服务器有什么关系?这是同一个人的两次测试。只有测试器中显示的货币对不同。

请看一下关于测试器的文章。

在另一个货币对上测试时,价格不需要相同。

 
Rosh:

请看一下关于测试器的文章。

在另一个货币对上测试时,价格不一定要匹配

因此,又做了一些测试。真的是 "当前价格 "的问题。

代码。

#include <Trade\SymbolInfo.mqh>
#include <Trade\Trade.mqh>

CSymbolInfo       m_sym;
CTrade            m_trade;

double bar_info[2];
bool a;

int OnInit()
{
   SymbolSelect("EURUSD", true);
   SymbolSelect("GBPUSD", true);
   m_sym.Name("EURUSD");
   a = false;
   return(0);
}

void OnTick()
{
   if (a) return;
   a = true;
   m_sym.Refresh();
   m_sym.RefreshRates();
   CopyHigh("EURUSD", PERIOD_D1, 0, 2, bar_info);
   Print("Текущая цена Ask:" + DoubleToString(m_sym.Ask()));
   Print("Текущая цена Bid:" + DoubleToString(m_sym.Bid()));
   Print("Цена открытия:" + DoubleToString(bar_info[1] + 5000*_Point));
   BUY_pending("EURUSD");
   Print("Текущая цена Ask:" + DoubleToString(m_sym.Ask()));
   Print("Текущая цена Bid:" + DoubleToString(m_sym.Bid()));
}

uint BUY_pending(string symbol)
{
   CopyHigh(symbol, PERIOD_D1, 0, 2, bar_info);
   // готовим запрос
   MqlTradeRequest request = {0};
   ZeroMemory(request);
   request.action = TRADE_ACTION_PENDING;
   request.magic  = 0;
   request.symbol = symbol;
   request.volume = 1;
   request.price  = m_sym.Ask() + 1;
   request.sl     = 0;
   request.tp     = 0;
   request.deviation = 10;
   request.type   = ORDER_TYPE_BUY_STOP; 
   request.type_filling = ORDER_FILLING_FOK;
   MqlTradeResult result;
   OrderSend(request,result);
   Print(IntegerToString(result.retcode));
   return (result.retcode);
}

注意,我是以问号价格加1的价格开盘的(有巨大的保证金)。在同一时间前后,我打印了当前的卖价和买价。


结果(在GBPUSD上测试时)。

GR      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Текущая цена Ask:1.29241000
LH      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Текущая цена Bid:1.29220000
QL      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Цена открытия:1.34220000
GD      0       Trade   11:49:40        2012.01.02 09:00:00   buy stop 1.00 EURUSD at 2.29241 (1.29709 / 1.29722)
IG      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   10009
CP      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Текущая цена Ask:1.29241000
HG      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Текущая цена Bid:1.29220000

价格1.29241在下单之前和之后都被打印出来。同时,在括号内(下单时),价格为1.29722。如何?还是我获得的当前价格不正确?


其次,如果价格有误,那么为什么会出现错误10016(停止)?

 
ilunga:

但在切面中仍然存在错误。

说实话,我不太明白,在没有停车的情况下,10016号错误 是如何出现的。

我不知道你在做什么和怎么做,问题可能真的在SL。

我的版本工作起来没有问题。然而,这个调用扔在了初始化块中,不需要费心检查(尽管在设置之前存在的顺序值得检查)。

bool BUY_pending(string symbol,ENUM_TIMEFRAMES period,double volume,ulong magic = 0)
{
//----------------------------------------------------------------------------//
//Work variables
double price = 0, sl = 0, tp = 0; //Prices: Open, Sell stop, Take profit
int ResCopy = -1; //Result of copying the data into an array
int Dig     = 0;  //Digits

bool Result = true; //Returned importance
//----------------------------------------------------------------------------//

ResetLastError();

//Checking the signal to stopping the trading system
  if(IsStopped()) return(false);
//Preparation of structures
ZeroMemory(TradeRequest);
ZeroMemory(TradeResult);
ZeroMemory(CheckResult);
//Copying the data into an array
ResCopy = CopyHigh(symbol,period,0,2,bar_info);

  if(ResCopy==-1)return(false); 
//Calculations
Dig   = (int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);

price = NormalizeDouble(bar_info[1] + 500*_Point,Dig);
sl    = NormalizeDouble(price - 200*_Point,Dig);
tp    = NormalizeDouble(price + 1000*_Point,Dig);
//Preparation of request
TradeRequest.type_filling = ORDER_FILLING_FOK;
TradeRequest.action       = TRADE_ACTION_PENDING;
TradeRequest.type         = ORDER_TYPE_BUY_STOP; 
TradeRequest.deviation    = 10;
TradeRequest.symbol = symbol;
TradeRequest.magic  = magic;
TradeRequest.volume = volume;
TradeRequest.price  = price;
TradeRequest.sl     = sl;
TradeRequest.tp     = tp;
//Checking
Result = OrderCheck(TradeRequest,CheckResult);
  if((!Result)||(CheckResult.retcode!=0))return(false);
//OrderSend
Result = OrderSend(TradeRequest,TradeResult);
//Checking for presence of the errors
  if(_LastError!=0){Result = false;}
//----------------------------------------------------------------------------//
return(Result);
//----------------------------------------------------------------------------//
}
附加的文件:
 
Interesting:

我不知道你在做什么或怎么做,问题可能真的出在SL。

我的版本工作起来没有问题。调用是真实的,但我把调用扔给了初始化块,不屑于检查(尽管在设置之前存在的命令值得检查)。

一个小小的请求。你能纠正代码,使其在OrderSend之前输出符号的当前价格 吗?
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
 
ilunga:
一个小小的请求。你能不能调整一下代码,在OrderSend之前,输出我们开仓的工具的当前价格

这样试试吧。

   MqlTradeResult result;
   if(!OrderSend(request,result))
     {
      PrintFormat("retcode=%d price=%G  Ask=%G  Bid=%G Comment=%s",
                  result.retcode,result.price,result.ask,result.bid,result.comment);
      //---
      PrintFormat("%s %s at %G Ask=%G  Bid=%G  ",
                  EnumToString(request.type),symbol,request.price,SymbolInfoDouble(symbol,SYMBOL_ASK),
                  SymbolInfoDouble(symbol,SYMBOL_BID));
      Print("------------");
     }
 
ilunga:
小小的请求。你能纠正一下代码吗,在OrderSend之前,它能推断出我们打开的那个工具上的当前价格

一个价格的喷雾器?我认为没有这个必要,你可以添加一条关于检查成功/失败的信息,以及订单的设置。

原则上你可以自己做,应该不难(按想法)。

罗什

这样试试吧。

对于调试来说,它将做得相当好,在工作代码中,它将是多余的(至少是一个有点麻烦的解决方案)。

而且最好在OrderCheck之后下订单,这样万一出错就不会进入OrderSend。

PS

我忘了补充,根据这个例子,bar_info 可以放在一个函数中,没有问题。

 
Interesting:

一个价格的喷雾器?我认为没有这个必要,你可以添加一条关于检查成功/失败的信息,以及订单的设置。

原则上,你可以自己做,这应该不难(在想法上)。

对于调试来说,这可能足够好,但在生产代码中,这将是多余的(至少是有点歪打正着的解决方案)。

最好是在OrderCheck之后下订单,这样万一出现错误,我们就不会进入OrderSend。

PS

我忘了补充,根据这个例子,bar_info 也可以放在一个函数中,没有任何问题。

这很有趣。在你的例子中,我已经删除了英镑的BUYSTOP,只剩下欧元兑美元了。

在填写完请求中的字段后,我已经输出了挂单 的价格。

1) 你有变体--挂单被放置在Inite中。

2012.01.01 00:00:00 价格 = 1.30487000

2) 我注释了init,把它移到OnTick。我设置了一个条件,只在第一个刻度线上触发。

2012.01.02 09:00:00 价格 = 1.29720000


P.S. 我正确地理解,在我的(和你的)代码中bar_info[1]是当前条形的最大值?

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5