[警告关闭!]任何新手问题,为了不给论坛添乱。专业人士,不要走过。没有你,哪里都不能去。 - 页 1114

 
pr0fess0r64


1.我们需要从代码中删除&&OrderSymbol()==Symbol()。

2.需要将出价和要价正常化a。

3.最好不要把滑点设置为10个点,而是动态地计算它。例如,如果一个黄金订单,这个工具每刻度线传输50点,那么10点的滑动将导致重新报价。因此,最好是计算最小刻度线的大小并乘以这个10。

4.你必须在你的代码中插入错误处理。否则,在失败的情况下,你将不明白为什么订单没有被关闭的原因。

 
drknn:


1.你应该从代码中删除&&OrderSymbol()==Symbol()。

2.需要使买入和卖出正常化。

3.滑点最好是动态计算,而不是10个点。例如,如果一个关于黄金的订单,这个工具每格移动50点,那么10点的滑移将导致你大量的重新报价。因此,最好是计算最小刻度线的大小并乘以这个10。

4.你必须在你的代码中插入错误处理。否则,在失败的情况下,你将不明白为什么订单没有关闭的原因。

这是一般的看法,你可以想出一大堆细节。
 
pr0fess0r64:
非常感谢,我将在测试器中尝试,但关于订单的修改,你有什么建议吗?
修改时,日志中是否有错误?
 

退货会寄到哪里?

很明显,到了0线,等待打勾。

int start()
  {
//----
   
//----
   return(0);
  }

这里也很清楚--停止

   if(Lot_s<=0){
    Alert("Не выбран лот!");
    return;

在这里呢?

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает количество ордеров.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), ko=0, ot;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot>1 && ot<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ot==op)) {
          if (mn<0 || OrderMagicNumber()==mn) ko++;
        }
      }
    }
  }
  return(ko);
}
订单数的值是ko,那么下一个函数是否应该用ko来写?返回在这里做什么?
 

return()不会把任何人送到任何地方。

返回 操作符终止当前函数并将控制权返回给调用程序。使用return(expression); 可以终止当前函数并发送结果。运算符表达式用圆括号括起来,不能包含赋值运算符

 
Vinin:

return()不会把任何人送到任何地方。

返回 操作符终止当前函数并将控制权返回给调用程序。使用return(expression); 可以终止当前函数并发送结果。运算符表达式用圆括号括起来,不能包含赋值运算符。

哦,所以我们不对ko的结果进行显式赋值,而是通过返回来传递它?我想我明白了,谢谢。
 
那么,如果不满足条件,如何阻止EA的工作是正确的呢?不是为了让它睡觉,而是为了完全停止它。
 
Abzasc:
那么,如果不满足条件,如何阻止EA的工作是正确的呢?不是为了让它睡觉,而是为了完全停止它。

你说的 "让它睡觉 "是什么意思,你说的 "停止 "是什么意思?
 
Vinin:

"让人睡觉 "是什么意思?"停止 "又是什么意思?

放置睡眠 - 放置睡眠,然后它将尝试再次启动。

停止 - 完全停止,使专家顾问停止工作(改变其 "面貌")。

例如,专家顾问是在Eurobucks之下,但它被扔在了EuroJPY上。它检查符号,如果不匹配,它就会发出警报,并在手动重启之前不再尝试工作。

 
Abzasc:

放置睡眠 - 放置睡眠,然后它将尝试再次启动。

停止 - 完全停止,使专家顾问停止工作(改变其 "面貌")。

例如,专家顾问是在Eurobucks之下,但它被扔在了EuroJPY上。它检查符号,如果不匹配,它就会发出警报,在手动重启之前不会再尝试工作。


为什么这么复杂?

在start()函数中足以提供条件处理

int start(){
  if (Symbol()!="EURUSD") {
     Alert("Советник должен работать только на EURUSD");
     return(0);
  }
  // Далее обработка, принятие решений

}
在这种情况下,如果你把EA放在错误的工具上,你将被警报淹没,直到你自己禁用它(EA)。

你也可以添加一个警报器的声音,然后你可以肯定地关闭它。

原因: