[存档!]任何菜鸟问题,为了不给论坛添乱。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 2. - 页 113

 
IgorM:

有时在init()中会有复杂的计算或加载历史记录,或者有大量的指标和专家顾问挂在终端或...

但如果终端在初始化过程中中断了代码,日志中会出现以下错误:"....超时在专家...."

如果日志显示终端没有错误,说明初始化成功了。 start()函数本身很容易检查--在第一行写start(): Print("new tick")。


我是这样做的()。

int start()
  {
  Print("start");
  
/*current_values_from_MT(CUR, CUR_BUF);
current_values_from_MT(MAIN, MAIN_BUF);*/

  


   return(0);
  }

是的,我在摇晃着很多信息,计算也是,实验也是用蜱虫......。

计算需要2-3分钟,MT "不挂起",一切工作都很典型,显示来自Print() 和Alert的信息,然后就是一切))

看了MT的所有信息,我找不到任何错误......。

请协助。

 
BBSL:

计算需要2-3分钟,MT没有 "挂起",一切工作都很典型,显示Print()和Alert信息,然后就一切正常))

如果Print()被打印出来,start()肯定能工作,但我对你说的计算需要2-3分钟感到困惑--在终端上有这样的负载,你需要用sleep() 函数中断计算,否则终端肯定会挂掉。

由于MT4没有调试器,在有问题的代码部分插入Print(),并捕捉失败或没有失败的代码部分和条件。

 
我需要修复由TakeProfit或StopLoss触发未结订单的事实,而TakeProfit和StopLoss的值对我来说并不感兴趣。
 
Jaguar1974:

如何检查订单是否被止盈或止损所触发?谢谢你的答复

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по стопу.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, osl;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    osl=NormalizeDouble(OrderStopLoss(), dg);
    if (ocp==osl) return(True);
  }
  return(False);
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по тейку.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if (ocp==otp) return(True);
  }
  return(False);
}
熟悉这两个函数的代码,并将它们合并为一个,以优化执行速度 和你的具体任务......
 
eddy:
Sayod 你在什么时间段进行过交易,用什么参数?


有什么区别,或者你把它反过来了,想测试一下?

默认在h1上交易。

琵琶步 - 30

LotExpo - 1.59

我认为,如果这个想法已经实现,参数并不重要,我认为专家顾问在任何参数下都会很好,IMHO。

 
Jaguar1974:
我需要提交由TakeProfit或StopLoss触发的未结订单的事实。我对TakeProfit和StopLoss的实际值不感兴趣。 。

如果你只想登记订单被触发的事实,那么你可以记住前一个tick上的订单数量,并与下一个tick上的订单数量进行比较--如果订单数量发生了变化,这意味着....
 
kiimar:
终端关闭了亏损的订单,注释为 "所以:19.5%/28.4/145.8"。这意味着什么呢?
这意味着,当达到19.5%的自由保证金水平时,发生了止损,亏损的交易根据规则被关闭。
 
IgorM:

如果Print()打印出来,那么你肯定有start()工作,但我对你说的计算需要2-3分钟感到困惑--在终端的这种负载下,你需要用sleep()函数中断计算,否则终端肯定会挂起。

由于MT4没有调试器,在有疑问的代码部分插入Print(),并捕捉失败或没有失败的代码部分和条件。


对不起,我弄错了,打印 只在init中有效。我无法进入启动))。

是的,在每个函数的末尾,我都打印了一个相关的信息,以检查是否一切正常。 所有的信息(所有的函数)都100%地工作,直到init的末尾,我不能去启动!"。

预先感谢您的回答!

 
谢谢,我还有很多东西要学。
artmedia70:
熟悉这两个函数的代码,并将它们合并为一个,以优化执行速度和你的具体任务......
 
BBSL:


对不起,我说错了,打印只适用于inite。我无法进入启动))。

是的,在每个函数的末尾,我都插入一个打印的信息,以检查是否一切正常。 所有的信息(所有的函数)都是100%的工作,直到init的结束,我不能去启动!我的意思是说,我不能去启动。

预先感谢您的回答!

因此,坦率地说,你在终端没有打勾。也就是说,要么没有连接,要么你在离线图表上工作,或者在init中检查IsExpertEnabled(),如果不允许,那就启用EA。