错误、漏洞、问题 - 页 52

 
在MT4中不是这样的,谢谢你。只是把它拿下来了。
 

在测试专家顾问的过程中。
Exp_TEMA.mq5, from the article:"创建一个在不同符号上交易的专家顾问"。,表达式Told[] Tnew[1]得到以下值。
Told[] 表达式不能被评估
Tnew[1] 阵列范围无效。

还有My_First_EA.mq5,来自文章。"为初学者编写MQL5专家顾问的分步指南",表示
New_Time[1]得到的值:无效的数组范围

Expression could not be evaluated,Invalid array range,这些值对EA结果有什么影响?

 

被告知 - 没有大小的空数组

Tnew[1] - 出了数组,数组被描述为Tnew[1],所以它的元素只能作为Tnew[0]被访问,因为索引从零开始。

 
Renat:

被告知 - 没有大小的空数组

Tnew[1] - 出了数组,数组被描述为Tnew[1],所以它的元素只能作为Tnew[0]被访问,因为索引从零开始。


至于Tnew,我已经在另一个论坛主题中提到了,显然,需要开发人员的评论:)
 

请告诉我如何在每个条件下只开一个交易。用我的代码,终端在这个条件下会打开几个交易,但我只需要一个。

       if(Buy_Signal)
        {
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         //--- отсылаем ордер
         OrderSend(mrequest,mresult);        
        }        

       if(Sell_Signal)
        {
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена Bid
         mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); // Take Profit
         mrequest.type= ORDER_TYPE_SELL;                                       // ордер на продажу                                          
         //--- отсылаем ордер
         OrderSend(mrequest,mresult);              
        }
      

结果是以下图片。

我如何检查一个交易是否已经完成了这个条件?我试过这种方式,但没有用。

// в этом цикле поочередно перебираем все открытые позиции
   for(i=0;i<PositionsTotal();i++)
     {
      // выбираем позиции только по "нашему" инструменту
      if(Symbol()==PositionGetSymbol(i))
     ...
     }
 
AM2:

请告诉我如何在每个条件下只开一个交易。用我的代码,终端在这个条件下会打开几个交易,但我只需要一个。

结果是以下图片。

我如何检查一个交易是否已经完成了这个条件?我试过这种方式,但没有用。

如果有PositionSelect 这样一个奇妙的东西,为什么还要在循环中安排搜索

我们只是在有趣的符号上检查位置的存在,如果它是真的,我们就去喝白兰地和抽雪茄。:)

PS

根据我的理解 PositionGetString,而没有PositionSelect应该是不行的我们不需要知道所有开放姿势的符号,对吗?

 
Interesting:

PositionSelect 这么好的东西,就没有必要在循环中搜索

只需在我们感兴趣的工具上检查是否存在某个位置,如果结果是真的,我们就静静地去喝白兰地和抽雪茄。:)

PS

根据我的理解 PositionGetString,而没有PositionSelect应该是不行的我们不需要知道所有开放姿势的符号,对吗?

这个代码考虑到了未结头寸的存在。

   if(Buy_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         OrderSend(mrequest,mresult);                                          // отсылаем ордер                
     }

但当买入信号条件满足时,它就会继续开仓。我想要的是,在Sell_Signal发生之前,Buy_Signal的头寸不会再次打开。我正试图这样实现它。

   Buy_Signal = true;
   Sell_Signal = true;                

   if(Buy_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         OrderSend(mrequest,mresult);                                          // отсылаем ордер
         Buy_Signal = false;
         Sell_Signal = true;                
     }


   if(Sell_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type= ORDER_TYPE_SELL;                                       // ордер на продажу
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена Bid
         mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); // Take Profit
         OrderSend(mrequest,mresult);                                          // отсылаем ордер    
         Buy_Signal = true;
         Sell_Signal = false;                
     }
它不去了。
 
AM2:

这样的代码考虑到了未结头寸的存在。

但当买入信号条件得到满足时,它将继续开仓。我需要确保在Sell_Signal条件发生之前,Buy_Signal不会再开仓。我正试图这样实施。

它没有。

为什么是这个代码?它勉强看起来像我的意思(我怀疑它是否正确)。

   if(Buy_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type = ORDER_TYPE_BUY;                                     // ордер на покупку
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);          // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit 
         OrderSend(mrequest,mresult);                                        // отсылаем ордер                
     }

而我的意思是这样的。

Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);

SL = NormalizeDouble(Ask - 500*_Point,_Digits);  // Stop Loss
TP = NormalizeDouble(Ask + 1500*_Point,_Digits); // Take Profit

  if(Buy_Signal)
  //Получен сигнал на market buy
  {
  
    if(!PositionSelect(_Symbol))
    //Позиции по данному символу отсутствуют
    {
    mrequest.action = TRADE_ACTION_DEAL; //Установка рыночного ордера (позиция)
    mrequest.type   = ORDER_TYPE_BUY;    //Ордер на покупку
    mrequest.magic = 18072010;          //ORDER_MAGIC
    mrequest.symbol = _Symbol;          //Инструмент
    mrequest.volume = 0.1;              //Объем в 0.1 лот
    mrequest.price = Ask;   //Цена открытия
    mrequest.sl = SL;       //Stop Loss
    mrequest.tp = TP;       //Take Profit
    mrequest.deviation = 5; //Отклонение в 5 пунктов   
    OrderSend(mrequest,mresult); //Отсылаем ордер
    }
  
  }

至少你可以在一个区块中进行。

  if((Buy_Signal)&&(!PositionSelect(_Symbol)))
  //Получен сигнал market buy
  {
  ...........................................  
  }
 
Interesting:

为什么是这个特定的代码?它甚至与我的意思一点也不像(我怀疑它根本不对)

而我的意思是这样的。

最起码一切都可以在一个区块内完成。

if((Buy_Signal)&&(!PositionSelect(_Symbol)))
  //Получен сигнал market buy
  {
  ...........................................  
  }

这个和上面的代码在平仓前不会开仓,但如果条件满足,在下一个交易日平仓后会重新开仓。我是这样实施的。

bool BuyOne = true, SellOne = true; // только один ордер.  глобальные переменные




   if(Buy_Signal &&                                                         // покупаем если есть сигнал на покупку
      PositionSelect(Symbol())==false &&                                    // ордер закрыт
      BuyOne)                                                               // при условии на покупку ставим только один ордер
     {
      mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
      mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
      mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
      mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
      OrderSend(mrequest,mresult);                                          // отсылаем ордер
      BuyOne = false;                                                       // на покупку только один ордер                                                  
      SellOne = true;                                                       // меняем флаг одного ордера на продажу          
     }

谢谢你!我已经考虑到了你的所有愿望。 现在一切正常了。我已经发布了专家顾问,以供发表。我可以在代码中再做一些修改。诱惑无极限)))

 
我没有在文档中找到任何关于MqlTradeCheckResult贸易请求 检查结果结构的响应代码(Retcode)的描述。会不会有呢?
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса - Документация по MQL5