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

 
Artyom Trishkin:

我知道,你需要以某种方式向专家顾问指出你希望它追踪的手动开仓的票据。

  1. 你应该在专家顾问中加入对新开仓位的追踪,如果它没有魔力,就意味着它是手动开仓的。专家顾问应在其开仓的价格和条形图上标记该仓位的开仓。对象的名称必须包含一个与所有此类对象的通用名称的前缀,例如 "manual_",并且位置的票据也必须存在。因此,对象的名称可以是如下。"手册_12345678"。这里:manual_--前缀,12345678--位置票。
  2. 添加到专家顾问的OnChartEvent()中,并监测鼠标点击对象的事件。分析对象的名称,如果它包含一个子串manual_,那么就看manual_后面的数字。这个数字是你所点击的位置的门票。
  3. 然后你需要保存找到的号码,这样当你重新启动EA/终端/电脑/世界时,它就不会丢失。例如,在资源或终端的全局变量 中。
  4. 专家顾问应阅读此资源,并从其中取出要拖动的仓位票。
  5. 在拖曳循环中,你应该获取所选位置的票据,并在保存的票据列表中寻找这个号码。如果发现这样的票据,就必须对有此票据的位置进行追踪。
  6. 如果改变仓位数量,必须检查关闭仓位的票据,并在保存的列表中找到。如果列表中存在这样的票据,就必须从该列表中删除--该位置不再存在,而且在票据列表中的票据也没有什么可做的,可以进行拖网。
类似这样的事情。逻辑是写在曲柄上的,所以不能考虑到一些东西......。


谢谢你的澄清,现在我明白了我的意思。

对我来说,mql课程建议设置3(EURUSD),但货币的流动性不同,其速度也不同。在正常的市场条件下,美元对和交叉盘可以作为一个指导性的数字是什么?

 
是否可以用CopyOpen、CopyHigh、CopyLow和CopyClose来填充一个多维缓冲区?描述中说,它复制到一个动态数组 - 但动态数组可以是多维的MQL5
 
Alexandr Sokolov:
是否可以使用CopyOpen、CopyHigh、CopyLow和CopyClose函数 来填充一个多维缓冲区?描述中说,它复制到一个动态数组 - 但动态数组可以是多维的MQL5

使用一个一维数组...

 
Alexandr Sokolov:
是否可以使用函数CopyOpen、CopyHigh、CopyLow和CopyClose来填充一个多维缓冲区?说明中说,它复制到一个动态数组中--但动态数组可以是多维的。

如果你难以理解这些结构,你可以使用ArrayCopyRates

int  ArrayCopyRates( 
   void&     dest_array[][],    // массив, переданный по ссылке 
   string    symbol=NULL,       // инструмент 
   int       timeframe=0        // таймфрейм 
   );

如果你对它有充分的了解,你最好

CopyRates - Доступ к таймсериям и индикаторам - Справочник MQL4
CopyRates - Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
Получает в массив rates_array исторические данные структуры MqlRates указанного символа-периода в указанном количестве. Отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар. При копировании заранее неизвестного количества данных рекомендуется в качестве приемного...
 

你好。我试着从几个EA中建立一个EA,在策略测试器中 一切工作正常(我在可视化模式下检查)。我试着使用模拟账户,现在我遇到了以下问题,一个订单被打开,然后被删除,这种情况在一个小时内发生,直到小时变化。我以为有一个条件可以同时输入和删除订单,但删除只是在时间上,我删除这整个块的错误还没有消失。如果有人不嫌麻烦,告诉我错误在哪里。

int start()
{
   // модификация до безубытка
   if (MathAbs((OrderOpenPrice()-Ask)/Point) > BUP && CountBuy() > 0)
      ModifyLoss();

   if (MathAbs((OrderOpenPrice()-Bid)/Point) > BUP && CountSell() > 0)
      ModifyLoss();
      
      
   CurrHour = TimeHour(TimeCurrent());
   
   if (CloseByTime == true && DayOfWeek() == DayEnd && CurrHour >= CloseHour)
   {
      if (CountTrades() > 0 || CountStop() > 0) CloseTrades();
   
     
   }
     

   if (DayStart == DayOfWeek() && CurrHour == StartHour && ((!SetLimits && CountStop() == 0) || (SetLimits && CountLimits() == 0)) && CountTrades() == 0)
   {
      high = iHigh(Symbol(), 0, 1);
      low  = iLow(Symbol(), 0, 1);
      spread = MarketInfo(Symbol(),MODE_SPREAD);
      
      if ((high - low)/Point <= MaxPips && spread < Maxspread)
      {
         buy  = NormalizeDouble(high + Indent*Point, Digits);
         sell = NormalizeDouble(low - Indent*Point, Digits);
        
      
         if (FixedLot > 0)
            Lots = FixedLot;
         else Lots = GetLots();

         if (UseMartingale == true)
         {
            if (AccountBalance() < abalance) 
               Lots = getlotlast();
            else abalance = AccountBalance();
         }
         
         if (!SetLimits)
         {
            tp_sell = ND(sell-spread*Point - TPP*Point);
            tp_buy  = ND(buy + spread*Point + TPP*Point);
         
            sl_sell = ND(sell + SLP*Point+spread*Point);
            sl_buy  = ND(buy-SLP*Point-spread*Point);
            
          if (iClose(NULL,1440,1) < iMA(NULL,1440,PeriodMA,0,MODE_EMA,PRICE_CLOSE,1)) 
                  OrderSendReliable(Symbol(), OP_SELLSTOP, Lots, (sell-spread*Point), Slippage, sl_sell,  tp_sell, comment, Magic, 0, Red);
                                                                         
                                                                        else
                  OrderSendReliable(Symbol(), OP_BUYSTOP,  Lots, (buy+spread*Point),  Slippage, sl_buy, tp_buy,  comment, Magic, 0, Blue);
                                                                       
         
            
         }else
         {
            tp_sell = ND(sell - MathAbs(buy-sell)*TakeProfitK);
            tp_buy  = ND(buy +  MathAbs(buy-sell)*TakeProfitK);
         
            sl_sell = ND(buy + MathAbs(buy-sell)*StopLossK);
            sl_buy  = ND(sell - MathAbs(buy-sell)*StopLossK);
         
            OrderSendReliable(Symbol(), OP_SELLLIMIT, Lots, buy,  Slippage, sl_sell, tp_sell,  comment, Magic, 0, Red);
            OrderSendReliable(Symbol(), OP_BUYLIMIT,  Lots, sell, Slippage, sl_buy,  tp_buy, comment, Magic, 0, Blue);
         }
      }
   }
   return(0);
}
 
craft11111:

你好。我试着从几个EA中建立一个EA,在策略测试器中 一切工作正常(我在可视化模式下检查)。我试着使用模拟账户,现在我遇到了以下问题,一个订单被打开,然后被删除,这种情况在一个小时内发生,直到小时变化。我以为有一个条件可以同时输入和删除订单,但删除只是在时间上,我删除这整个块的错误还没有消失。请告知错误在哪里。

有必要通过OrderSelect 在循环中做溢出处理

int start()
{
   // модификация до безубытка
   if (MathAbs((OrderOpenPrice()-Ask)/Point) > BUP && CountBuy() > 0)
      ModifyLoss();

   if (MathAbs((OrderOpenPrice()-Bid)/Point) > BUP && CountSell() > 0)
      ModifyLoss();
      
OrderOpenPrice - Торговые функции - Справочник MQL4
OrderOpenPrice - Торговые функции - Справочник MQL4
  • docs.mql4.com
OrderOpenPrice - Торговые функции - Справочник MQL4
 

据我所知,当一个条件发生时,会有一个过渡到修改函数的过程,在这个过程中只使用顺序选择。我也试着去掉这块,所有同样的错误仍然存在,而且并不总是能看到发生什么情况。

void ModifyLoss()
{
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 
   {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;
      if (OrderType() == OP_BUY)
      {
         SL = ND(OrderOpenPrice());
         if (OrderStopLoss() < SL && (Ask - OrderOpenPrice())/Point>= BUP)
         {
            if (SL != ND(OrderStopLoss()))
               OrderModify(OrderTicket(), OrderOpenPrice(), SL, OrderTakeProfit(), 0);
         }
      } else
      if (OrderType() == OP_SELL)
      {
         SL = ND(OrderOpenPrice());
         if (OrderStopLoss() > SL && (OrderOpenPrice()-Bid)/Point >= BUP)
         {
            if (SL != ND(OrderStopLoss()))
                OrderModify(OrderTicket(), OrderOpenPrice(), SL, OrderTakeProfit(), 0);
         }
      }
   }
}
 
craft11111:

你好。我试着从几个EA中建立一个EA,在策略测试器中 一切工作正常(我在可视化模式下检查)。我试着使用一个模拟账户,现在我得到了以下问题,一个订单被打开,然后被删除,这发生在一个小时内,直到小时变化。我以为有一个条件可以同时输入和删除订单,但删除只是在时间上,我删除这整个块的错误还没有消失。如果有人建议在哪里出错并不难。

你必须在函数Print(__FUNCTION__)或Print(这样那样的块,这样那样的参数)中写。观察这些功能/块被触发的顺序。第一个触发的,不应该有的,那就是问题所在了。依靠 "我在这里描述了它们同时触发的相当不相容的条件 "并不是一个好主意。也许单位不应该触发,但外部参数允许它触发,也许单位内部的东西不应该触发。

 

OnChartEvent() 在测试器中不起作用。

请展示能在测试器中工作的按钮。例如,点击哪个会升起trade = true的标志;再点击? trade = false。

 
Ghabo:

OnChartEvent()在测试器中不起作用。

请展示能在测试器中工作的按钮。例如,点击哪个将提高标志trade = true;再次点击? trade = false。

在OnTick()中控制按钮的按下。如果它在测试器中工作--在OnTick()中控制,但在现实世界中,这个控制不会被执行,将在OnChartEvent() 中控制。

原因: