新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1853

 
EVGENII SHELIPOV #:

我明白了,Rostislav

我不明白为什么如果我在这个函数中屏蔽了标志,专家顾问就开始一次开仓和平仓100-200个订单。

因为如果标志不等于 "0",它就会不断调用 ClosseAll()函数。
 
EVGENII SHELIPOV #:

我不明白为什么,如果我在这个函数中屏蔽了标志,EA就会一次打开和关闭100-200个订单。

让我用你的代码解释一下。

最初,该标志被设置。

int flag_close=0;
//+------------------------------------------------------------------+

然后,它打开订单

//-------------------------------------------------------------------+  Команда на открытие первых ордеров в сетке
   if((UseHour==1 && Hour() >= StartTime && Hour()<=StopTime)||UseHour==0)
     {

如果出现平仓条件(你有三个平仓条件)

//-------------------------------------------------------------------+  Команда на закрытие сетки ордеров при условии (Суммарный профит сетки >=0 и Просадка больше заданного уровня)
   if(CalculiteProfit() >= 0 && Drawdown > DrawdownClosingTakeprofitZero)
     {
      flag_close=1;
//-------------------------------------------------------------------+  Команда на закрытие сетки ордеров
   if((CountTrade(0) > 1 && CalculiteProfit() >= 0 && OrderGroupCloseSignal()==0)||(CountTrade(1) > 1 && CalculiteProfit() >= 0 && OrderGroupCloseSignal()==1))
     {
      flag_close=1;
//-------------------------------------------------------------------+  Команда на закрытие первых ордеров
   if((CountTrade(0) == 1 && CalculiteProfit() >= 0 &&  OrderCloseSignal()==0)||(CountTrade(1) == 1 && CalculiteProfit() >= 0 &&  OrderCloseSignal()==1))
     {
      flag_close=1;

这个标志的值为 "1",并开始关闭订单。

//-------------------------------------------------------------------+  Команда на закрытие ордеров
      if(flag_close==1)ClosseAll();

而一旦所有的订单被关闭,该标志就会变成 "0"。

   if(CountTrade() == 0)
     {
      flag_close=0;
 
Tretyakov Rostyslav #:
因为如果该标志不是 "0",它就会不断调用 ClosseAll()函数

只要下达了开单的命令,就可能是这种情况。所以有一种 "检查 "正在进行。

 
EVGENII SHELIPOV #:

只要下达了开单的命令,就可能是这种情况。所以有一种 "计算 "正在进行。

你有信用卡吗?

你走进一家商店,一次买一瓶啤酒,每次都用卡支付,直到卡上出现 "0"。

然后去给卡充值,再去买一瓶啤酒。

 
Mihail Matkovskij #:

是的,但锁是用同样的地段打开的。而两个不同方向的订单是同时开的。而套期保值是指当交易进入平仓期后,交易者在同一方向(不同方向我搞混了)以更大的手数 开仓,暗示价格将逆转,以赚取更大手数的交易的利润,并弥补更小手数的交易的损失或平均到0。

对冲绝对不是锁定,或部分锁定,而是一个完全不同的系统。

 
Vitaly Muzichenko #:

对冲绝对不是锁定,或部分锁定,而是一个完全不同的系统。

但我并不是说这是失败的。我昨天刚被搞糊涂了(我说:你应该开一个相反的头寸,而不是一个单向的头寸)。时间已经很晚了。而今天我明白了我错在哪里。

 
Mihail Matkovskij #:

但我并不是说这是失败的。我昨天刚被搞糊涂了(我说:你应该开一个相反的头寸,而不是一个单向的头寸)。时间已经很晚了。而今天我意识到我错在哪里了。

那就说得通了,它发生了 :)

 
EVGENII SHELIPOV #:

只要下达了开单的命令,就可能是这种情况。因此,有一种 "点击 "正在进行。

我们需要创建一个订单列表,有刻度的, 要关闭的(正如许多人已经在这里说过的)。如果机器人检测到了退出的信号,相应的订单(票据)应该被添加到列表中关闭。列表由一个发送关闭请求(OrderClose)的循环传递。然后,你应该不断检查是否有任何未完成的订单与已添加到列表中的门票。如果没有找到一张或多张票,我们应该从列表中删除它们。这样一来,函数就不会发送关闭不存在的订单的请求。

如何处理新的信号和订单,这些信号和订单出现在已填充的列表期间?你也可以把它们添加到列表中,由一个退出信号来关闭。这样,他们也会轮到自己被关闭。这就是全部。创建这样一个列表,并按票据循环关闭订单。你可以用一秒钟或几秒钟的间隔来做每一次的循环。我们所要实现的是这个算法,一切都会成功。

 
Mihail Matkovskij #:

我们需要创建一个订单清单,用票据来关闭(正如许多人在这里已经说过的)。如果机器人检测到出场信号,则将相应的订单(票据)添加到平仓列表。该列表由一个循环传递,该循环发送一个关闭请求(OrderClose)。然后,你应该不断检查是否有任何未完成的订单与已添加到列表中的门票。如果没有找到一张或多张票,我们应该从列表中删除它们。这样,函数就不会发送关闭不存在的订单的请求。

如何处理在已填充清单期间出现的新订单?你也可以把它们添加到关闭列表中。这样一来,他们也会轮到自己被关闭。这就是全部。建立这样一个清单,并循环地关闭礼仪上的订单。你可以用一秒钟或几秒钟的间隔来做每一个周期的传递。我们所要实现的是这种算法,一切都会成功。

它是否会依次关闭每一个? 当网格这么长时,它会关闭正确的。
当最后一个订单关闭时,可能发生有10个订单要关闭,它将一个一个地关闭所有的订单,这将花费无限的时间。

 
Alexander Avksentyev #:

当电网需要这么长的时间时,它将依次关闭右边的。
当你关闭最后一个订单时,可能发生有10个订单要关闭,所以它一个一个地关闭所有的订单,这需要无限的时间。

情况并不完全如此。所有的订单都由终端逐一关闭。在OrderSend 循环中,它可能在一秒钟内触发多次(取决于你的硬件)。但OrderSend只将适当的命令添加到关闭队列中然后,终端 在指定的时间间隔或在收到服务器对前一个请求的响应后向服务器发送这些命令,而不是立即发送。因此,无论如何,大量订单(头寸)的关闭速度要比单一订单慢得多。

原因: