任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 412

 
Ekburg:

天啊...我当然很高兴你开始解决问题,但我的留言你不知为何没有注意到,我在那里说了同样的话,有点不同的话,并立即说了缺点,除了关闭文件,没有立即看到你那里有它发生:)

你写了一个三段式的回应。在第一条中,你犯了一个错误(我的条目是非常正确的),在第二条中,你也犯了一个错误(虽然这条信息把它拉平了:)第三点听起来好像是你建议把光标移到条目之后,而不是之前(这又被认为是一个错误)。面对这样的画面,我更愿意从一位经验丰富的版主那里做出澄清,他的回答是:"我是一个很有经验的版主。

不过,确实感谢你的反馈。并祝大家新年快乐!:)

 

你好。面对一个不愉快的情况。在这里帮我一下。

我有一个专家顾问。它在策略测试器中运行良好,我没有任何要求。然而,当我在演示中运行它时,我看到EA无法在某些订单上设置止损。有一个错误并不总是出现,但有时会出现。我急于自己寻找,希望能得到你的帮助。应该指出的是,该EA在所有其他方面的工作都完美无缺,就像在测试器中一样,没有任何抱怨,只是问题是止损点并不总是被设置。该错误出现在不同的经纪商的不同账户上。以下是代码中负责交易操作的部分

ord_ticket=OrderSend(ASymb,ord_type,ord_lots,ord_openpr,20,0,0,"",ord_magic);
if(ord_ticket>0) {
  //---- обновление инфы
  OrderSelect(ord_ticket,SELECT_BY_TICKET);
  ord_openpr=OrderOpenPrice();
  ZigZagInfo[0][ZZ_TimeP]=t_cur;
  ZigZagInfo[k][ZZ_TryCount]++;
  //---- проверка стопов
  if(ND(a*(ord_tp-ord_openpr)-stops,Digits)<0) ord_tp=ND(ord_openpr+a*stops,Digits); 
  if(ND(a*(ord_openpr-ord_sl)-stops,Digits)<0) ord_sl=ND(ord_openpr-a*stops,Digits);
  //---- время удаления
  if(TimeDelete>0) td=TimeCurrent()+60*TimeDelete;
  else td=0;
  //----
  if(!OrderModify(ord_ticket,ord_openpr,ord_sl,ord_tp,td)) {
    Alert(Error(GetLastError()),"/nSL=",DoubleToStr(ord_sl,5)," TP=",DoubleToStr(ord_tp,5),"/nTimeDel=",TimeToStr(td),
          "OP=",DoubleToStr(ord_openpr,5));
  }
}

以下是Error(int er)函数的代码

string Error(int er) {
  switch(er) {
    case 0:   return("Нет ошибки");
    case 1:   return("Нет ошибки, но результат неизвестен");
    case 2:   return("Общая ошибка(сбой системы, глюк, и т.п.)");
    case 3:   return("Неправильные параметры");
    case 4:   return("Торговый сервер занят");
    case 6:   return("Нет связи с торговым сервером");
    case 7:   return("Недостаточно прав");
    case 8:   return("Слишком частые запросы");
    case 9:   return("Недопустимая операция нарушающая функционирование сервера");
    case 128: return("Истек срок ожидания совершения сделки");
    case 129: return("Неправильная цена");
    case 130: return("Неправильные стопы");
    case 131: return("Неправильный объем");
    case 133: return("Торговля запрещена");
    case 134: return("Недостаточно денег для совершения операции");
    case 135: return("Цена изменилась");
    case 137: return("Брокер занят");
    case 138: return("Новые цены");
    case 139: return("Ордер заблокирован и уже обрабатывается");
    case 140: return("Разрешена только покупка");
    case 141: return("Слишком много запросов");
    case 145: return("Модификация запрещена, так как ордер слишком близок к рынку");
    case 146: return("Подсистема торговли занята");
    case 147: return("Использование даты истечения ордера запрещено брокером");
    case 148: return("Количество открытых и отложенных ордеров достигло предела, установленного брокером");
    case 149: return("Попытка открыть противоположную позицию к уже существующей в случае, если хеджирование запрещено.");
    default:  return("Неизвестная ошибка "+DoubleToStr(er,0));
  }
}

因此,当EA设置止损失败时,会出现一条信息,显示错误信息和它试图修改的订单的参数。他写的东西对我来说才是真正的奥秘。从下面的图片可以看出,它不断地写出音量是错误的。这很奇怪。我应该补充的是,所有的订单参数在修改前都是正确计算的,这可以在信息中看到。否则错误就会不同。该方案在测试时的价差比演示中的要高。

謎語另一个

 
_Vladimir_:

你好。面对一个不愉快的情况。在这里帮我一下。

我有一个专家顾问。它在策略测试器中运行良好,我没有任何要求。然而,当我在演示中运行它时,我看到EA无法在某些订单上设置止损。有一个错误并不总是出现,但有时会出现。我急于自己寻找,希望能得到你的帮助。应该指出的是,该EA在所有其他方面的工作都完美无缺,就像在测试器中一样,没有任何抱怨,只是问题是止损点并不总是被设置。该错误出现在不同账户的不同经纪公司。以下是代码中负责交易操作的部分

以下是Error(int er)函数的代码

因此,当EA设置止损失败时,会出现一条信息,显示错误信息和它试图修改的订单的参数。他写的东西对我来说才是真正的奥秘。从下面的图片可以看出,它不断地写出音量是错误的。这很奇怪。我应该补充的是,所有的订单参数在修改前都是正确计算的,这可以在信息中看到。否则错误就会不同。该方案在测试时的价差比演示中的要高。

对你的全局变量的值要小心。我可以假设ord_ticket是一个全局变量,这意味着之前的值可以存储在其中。而在调用GetLastError()来捕捉错误之前,你应该在代码的开头调用它来重置之前的值。
 
TarasBY:
你应该对你的全局变量的值非常小心。我可以建议,ord_ticket是一个全局变量,因此它可能存储了之前的值。而在调用GetLastError()来捕捉错误之前,你应该在代码的开头调用它来重置之前的值。

ord_ticket是在本地一级声明的。然后,即使它在第一行中被全局声明了

ord_ticket=OrderSend(ASymb,ord_type,ord_lots,ord_openpr,20,0,0,"",ord_magic);
if(ord_ticket>0) {

它的价值肯定会改变。如果交易成功,它将是订单号,否则就是-1。因此,如果订单没有被打开,我们就不会进入设置止损的环节。

还应该注意的是,OrderSend() 函数总是改变最后一个错误的值 (根据文档和逻辑),所以在这种情况下重置之前的读数是没有必要的,会导致简单的浪费时间。也就是说,错误131出现在进入停止设置块之后和显示错误信息之前。由于没有真正放置止损点,OrderModify()函数必须是最后一个被调用的函数,它和前一个函数一样,总是改变最后一个错误的值。但我不能理解为什么它不改变最后一个错误的值。它是从哪里来的?我再一次说,测试器中没有任何问题。

我有个想法,经纪人在作弊,因为服务器会把错误号码发送到终端,而后者又会把它们发送到专家顾问那里。我已经放弃了这个想法,因为只有一个EA的订单有错误,其他并行工作的EA没有这样的错误。

 
_Vladimir_:

ord_ticket是在本地一级声明的。然后,即使它在第一行中被全局声明了

价值肯定会改变。如果交易成功,它将是订单号,否则就是-1。因此,如果订单没有被打开,我们就不会进入设置止损的环节。

还应该注意的是,OrderSend() 函数总是改变最后一个错误的值(根据文档和逻辑),所以在这种情况下重置之前的读数是没有必要的,会导致简单的浪费时间 也就是说,错误131出现在进入停止设置块之后和显示错误信息之前。由于没有真正放置止损点,OrderModify()函数必须是最后一个被调用的函数,它和前一个函数一样,总是改变最后一个错误的值。但我不能理解为什么它不改变最后一个错误的值。它是从哪里来的?我再一次说,测试器中没有任何问题。

我有个想法,经纪人在作弊,因为服务器会把错误号码发送到终端,而后者又会把它们发送到专家顾问那里。我很快就放弃了这个想法,因为只有一个EA的订单有这样的问题,其他并行工作的EA并没有出现错误。


我再补充一下。并行工作的EA的代码是完全相同的,它负责设置止损。这个EA从来没有出现过没有为订单设置止损的情况。

看来上面某个地方的参数计算有误,但如果只有一个参数出错,应该会出现另一个错误。例如,著名的130

 
_Vladimir_:

ord_ticket是在本地一级声明的。然后,即使它在第一行中被全局声明了

价值肯定会改变。如果交易成功,它将是订单号,否则就是-1。因此,如果订单没有被打开,我们就不会进入设置止损的环节。

还应该注意的是,OrderSend() 函数总是改变最后一个错误的值(根据文档和逻辑),所以在这种情况下重置之前的读数是没有必要的,会导致简单的浪费时间 也就是说,错误131出现在进入停止设置块之后和显示错误信息之前。由于没有真正放置止损点,OrderModify()函数必须是最后一个被调用的函数,它和前一个函数一样,总是改变最后一个错误的值。但我不能理解为什么它不改变最后一个错误的值。它是从哪里来的?我再一次说,测试器中没有任何问题。

我有个想法,经纪人在作弊,因为服务器会把错误号码发送到终端,而后者又会把它们发送到专家顾问那里。我很快放弃了这个想法,因为只有一个EA的订单有错误,其他并行工作的EA没有这样的错误。

思想在竞赛!但经验表明,我们所想的(应该是这样的)和实际存在的往往是不同的东西。可以建议什么。"预先打印你的代码执行的整个序列",--这是发现错误(或确保你是正确的)的最快方法。:)
 
yan720:

你写了一个三点回应。在第一条中,你犯了一个错误(我的条目是非常正确的),在第二条中,你也犯了一个错误(虽然这条信息把它拉平了:)第三点听起来好像是你建议把光标移到条目之后,而不是之前(这又被认为是一个错误)。面对这样的画面,我宁愿向回答问题的多才多艺的主持人做出澄清。

不过,确实感谢你的答复。还有,新年快乐!:)



:D 好的,也祝你新年快乐 :)
 
回到第411页上写的内容......。有谁知道如何结合该代码和跨越两个MAs的进入/退出条件?
 
petya33r:
回到第411页上写的内容......。有谁知道如何将该代码和穿越两个MAs的进入/退出条件结合起来? 还是挂单是唯一的选择?

在移动信号上打开交易后,开始监测订单数量 或具体的这个订单,如果订单数量减少或作为第二个选项被关闭,特别是这个订单,然后找出它是如何关闭的,如果是一个停止,然后在当前价格打开相反的订单,这就是全部。
 
Ekburg:

在移动信号上打开交易后,开始监测订单数量或具体的这个订单,如果订单数量减少或作为第二个选项具体关闭这个订单,然后找出它是如何关闭的,如果停止,那么只需在当前价格打开相反的订单,这就是全部。

我明白这一点,但我不能把它写下来。专家顾问要么只在muwings 信号 进行交易,在亏损的情况下不开立反向头寸,要么在测试开始时直接使终端崩溃。所以我写了一些根本无法处理的东西。我不太擅长写作。我需要书面代码形式的帮助。

//нет открытых ордеров - ищем в истории закрытых ордеров последний закрытый именно этим советником ордер 
  for ( trade = OrdersHistoryTotal() - 1; trade >= 0; trade-- ) 
  {
     if ( OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
     {
         old_order_type = OrderType();
         if ( OrderProfit()<0 ) //последний закрытый советником ордер был убыточным, значит, следующий ордер открываем в направлении, противоположном закрытому с убытком
         {
                break; //прекращаем поиск
         }
     }
  }
  //если раньше покупали, то теперь продаем
  if ( old_order_type == OP_BUY )
  {
      ticket = OrderSend(Symbol(), OP_SELL, Lot,  NormalizeDouble(Bid, Digits), slip, NormalizeDouble(Ask+stoploss*Point, Digits), NormalizeDouble(Ask-takeprofit*Point, Digits), "Martingale-Sell", MagicNumber, 0, Red);
      Sleep (2000); //задержка в 2 секунды для обработки запроса торговым сервером брокера
      return (0);  
  }

如果OrderProfit()<0,它将打开相反的 订单。但它不能与来自移动辅助设备的信号一起工作。你能写一个单一的代码,同时提供Muwings信号和开立相反头寸的条件吗?