[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要路过。没有你就无处可去 - 3. - 页 287

 
那么我是否能够看到正确的代码?
 
sergeev:
在第一个非买入订单中,你将用买入订单充斥账户。


谢谢你!发现了另一个错误!

//+------------------------------------------------------------------+
//|                                                      OnlyBuy.mq4 |
//|                      Copyright © 2011, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern double lots=0.1;
extern int SlipPage=3;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
  if (OrdersTotal()==0)
   OrderSend(Symbol(),OP_BUY,lots,NormalizeDouble(Ask,Digits),SlipPage,0,0,NULL,0,0,Red);
  for (int j = 0; j < OrdersTotal(); j++)
   {
    OrderSelect(j, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol() == Symbol())
     {
      if (OrderType() != OP_BUY)
       OrderSend(Symbol(),OP_BUY,lots,NormalizeDouble(Ask,Digits),SlipPage,0,0,NULL,0,0,Red);
     }
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
icas:


谢谢你!发现另一个错误!


嗯,嗯。

但之前的那个还没有被修复。

你不能把一个开盘的订单立即放入一个循环中。你必须先对订单做一个完整的循环,找出到底有没有买入。

而后你才把买入,在这个周期之后。

 
sergeev:

嗯,嗯。

但之前的那个并没有修好。

你不能把一个开盘的订单立即放入一个循环中。你必须首先对订单做一个完整的循环,并找出到底是有买还是没有。

只有在这之后,如果它还没有出现,你才应该购买。



对了,我只是从我的节目posti中抽取了一块,没有重新做。我现在就做 - 五分钟...
 
但这个代码也是不正确的!只有在没有任何其他金融工具的订单时,它才会打开买入订单,如果有任何其他订单,它就不会打开买入订单。
 
icas:

对了,我只是从我的节目posti中抽取了一块,没有重新做。我现在就做 - 五分钟...
//+------------------------------------------------------------------+
//|                                                      OnlyBuy.mq4 |
//|                      Copyright © 2011, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern double lots=0.1;
extern int SlipPage=3;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
  for (int j = 0; j < OrdersTotal(); j++)
   {
    OrderSelect(j, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol() == Symbol())
     {
      if (OrderType() == OP_BUY) return(0);
     }
   }
  OrderSend(Symbol(),OP_BUY,lots,NormalizeDouble(Ask,Digits),SlipPage,0,0,NULL,0,0,Red);
  Sleep(10000); //Пауза 10 сек. для исполнениея ордера
//----
   return(0);
  }
//+------------------------------------------------------------------+
就是现在,对吗?
 
icas:
现在是这样吗?
Sleep(10000); //Пауза 10 сек. для исполнениея ордера

这个停顿的意义是什么?
 
kolyango:

为什么停顿?

该订单不会立即执行。如果在下一个tick上没有暂停,订单可能还没有被打开,程序将发送另一个命令来打开它。在MT5测试器中,你已经可以输入执行延迟。
 
icas:
现在正确了吗?

你有没有试过把它作为一个单独的功能来搜索物品的存在/不存在?

比如说。

bool ExistPositions(int mn, string sy="", int op=-1) {
   if (sy=="") sy=Symbol();
   for (int i=0; i<OrdersTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS)) {
         if (OrderMagicNumber()!=mn)   continue;
         if (OrderSymbol()!=sy)        continue;
         if (OrderType()>1)            continue;
         if (op<0 || OrderType()==op)  
            return(True);
         }
      }
   return(False);
}

Magic - EA的神奇数字(在设置中设置,或由EA自动生成)。然后,要检查是否存在由当前符号买入的位置,应该写入。

if (!ExistPositions(Magic, Symbol(), OP_BUY)) {
   // ... Тут код для вызова функции открытия позиций ... 
   }

注意 - 不仅仅是一个打开买入订单的命令,而是一个处理所有订单打开参数和服务器返回错误的完整功能。

然而,对于一个测试人员来说,我们可以不检查输入的参数是否有效...

 
artmedia70:

你有没有试过把它作为一个单独的功能来搜索物品的存在/不存在?

比如说。

然后通过当前的符号来检查是否没有买入位置,应该写上。

注意 - 不仅仅是一个打开买入订单的命令,而是一个完整的功能,处理订单打开的所有参数和服务器返回的错误。

然而,测试人员可以不检查输入的参数是否为允许的值...



在第一篇文章中,我给出了功能,kolyango 对此并不满意。另外,我不喜欢和魔术师一起工作。