哪种设计是正确的? - 页 5

 
valenok2003:

其结果是这个脚本

问题--为什么它不总是关闭所有的订单?例如,我接连开了三个卖出订单,并试图关闭它们,但脚本可能会关闭其中一个或两个或所有的订单。原因是什么呢?

你需要一个脚本吗?

那么你就不需要while 语句了 脚本在循环中工作就可以了

对于脚本,你需要这样的结构...

我不记得链接了,这里是关闭所有未结订单的脚本。

//+------------------------------------------------------------------+
//|                                               CloseAllOrders.mq4 |
//|                       Copyright © 2008, PRMQuotes Software Corp. |
//|                                           Jedimedic77@gmail.com  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, PRMQuotes Software Corp."
#property link      ""
//+------------------------------------------------------------------+
//| EX4 imports                                                      |
//+------------------------------------------------------------------+
#include <stdlib.mqh>
//+------------------------------------------------------------------+
//| global variables to program:                                     |
//+------------------------------------------------------------------+
double Price[2];
int    giSlippage;
bool   CloseOpenOrders = true;
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
void start() {
  int iOrders=OrdersTotal()-1, i;
  
  if(CloseOpenOrders) {
    for(i=iOrders; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && (OrderType()<=OP_SELL) && GetMarketInfo() && 
      !OrderClose(OrderTicket(),OrderLots(),Price[1-OrderType()],giSlippage)) Print(OrderError());
    }
  }
}
//+------------------------------------------------------------------+
//| Function..: OrderError                                           |
//+------------------------------------------------------------------+
string OrderError() {
  int iError=GetLastError();
  return(StringConcatenate("Order:",OrderTicket()," GetLastError()=",iError," ",ErrorDescription(iError)));
}
//+------------------------------------------------------------------+
//| Function..: GetMarketInfo                                        |
//+------------------------------------------------------------------+
bool GetMarketInfo() {
  RefreshRates();
  Price[0]=MarketInfo(OrderSymbol(),MODE_ASK);
  Price[1]=MarketInfo(OrderSymbol(),MODE_BID);
  double dPoint=MarketInfo(OrderSymbol(),MODE_POINT);
  if(dPoint==0) return(false);
  giSlippage=(Price[0]-Price[1])/dPoint;
  return(Price[0]>0.0 && Price[1]>0.0);
}
//+------------------------------------------------------------------+
 
valenok2003:

其结果是这个脚本

问题--为什么它不总是关闭所有的订单?例如,我连续开了三个卖出订单,然后试图用脚本关闭它们,它可能会关闭一个或两个或所有的订单。原因是什么呢?
而引号是多少个数字?
 
khorosh:
而引号是多少个数字?
 
Martingeil:

你需要一个脚本吗?

当然,谢谢你。但要得到一个现成的剧本很容易。我想弄清楚原因是什么。
 
Martingeil:

你需要一个脚本吗?

那么你就不需要while 语句了 脚本在循环中工作就是如此


该脚本只起一次作用。那里没有自我循环,也从来没有过。

Valenok,你需要脚本完全关闭所有订单,还是只关闭这个符号?

 
Martingeil:

你需要一个脚本吗?

那么你就不需要while 语句了 脚本在循环中工作就可以了

对于一个脚本,你需要这样的结构...

我不记得链接了,这里有一个脚本,可以关闭所有未结订单。

while 代码中,只是为了在线程忙碌时进行延迟。
 
Techno:

该脚本只工作一次。那里没有自我触发,也从来没有过。

Valenok,你想让脚本完全关闭所有的订单,还是只关闭这个符号?

是的,你说错了,我的意思是它不依赖于蜱虫。
 
Techno:

该脚本只工作一次。那里没有自我触发,也从来没有过。

Valenok,你需要脚本来关闭所有的订单,还是只关闭这个符号?



只开一个符号的订单。待定的不受影响。

有趣的是,在kodobase中被批评的代码

int start()
{
//----
  while(OrdersTotal()>0)
  {
    for (int i=0; i < OrdersTotal(); i++)                                                        
    {                                                                                          
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
      {
        OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5);  
      }
    }
  }                                               
//----
   return(0);
}

工作起来没有任何问题,但当我开始改进它时,我开始有问题了。

zy。

关于误串的问题

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

我已经想明白了。

 
valenok2003:



只开一个符号的订单。我们不碰那些待定的。

所以,让它直接延期,顺其自然。在一般形式下。

int start()
{
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
    if(OrderSelect(i,SELECT_BY_POS)&&OrderSymbol()==Symbol())
      switch(OrderType())
         {
         case 0  : OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),5); break;
         case 1  : OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),5); break;
         default : OrderDelete(OrderTicket()); break;
         }
    }
        
}
 
Martingeil:
你是对的,我不是那个意思,不管是什么抽搐...


我很清楚这一点。
原因: