初学者的问题 MQL5 MT5 MetaTrader 5 - 页 412

 
Imminence:

你好,我有一个初学者的问题......

我不能让系统将最后一个条形图的收盘值与某一时期的高点和低点进行比较,比如说。

最后20小节。我做错了什么?


我用Alert检查了一下,不知什么原因,测试器显示的是最后一个tick的计算结果的最大值,但它给出的是这个值

它的次数与ticks相同,所以订单没有打开。


第二个问题是如何让我的EA等待下一个条形图的打开(30米周期)? 在检查点测试中一切正常,但如果我使用ticks。

然后,我的专家顾问在同一条线上打开,就在它以止损价收盘后......


另外,我如何关闭一个交易,而不考虑刻度线与否? 例如,对于一个30米的周期,我想在柱子结束前5秒关闭订单(29.55,59.55)。

基于那一刻的所有数据。在这个阶段的问题是,如果在5秒内没有发生勾选,因此没有

(理论上这是胡说八道,但在现实中,下一个tick可能会因为某些原因出现在几个蜡烛图中)。

可能由于某种原因,在一些蜡烛中。


提前感谢!

1.我没有看到代码中关于最后20条的内容。

2.如何确定一个新条形图的第一个刻度线

3.我如何在不检查是否打钩的情况下关闭一个订单?

我们必须避免使用OnTick,而使用OnTimer。 设置一个间隔为1秒的定时器,并检查其中的时间。计时器并不依赖于刻度。

/// Определяет начало нового бара
bool NewBar()
{
    static datetime lastbar = 0;
    datetime curbar = iTime(Symbol(), PERIOD_M30, 0);
    if(lastbar!=curbar)
    {
        lastbar=curbar;
        return (true);
    }
    return(false);
}
 
Leanid Aladzyeu:

o_oops不知道终端机也会戳到错误的地方,我第一次碰到了一个关键的错误

它向它吐口水。

当然会吐槽,你访问一个维度为2的数组的第3个元素--mas[2]++。

void Oher(int Mag,string Symb, int &mas[2])
..............
...........

case 1:mas[1]++; mas [2]++;break;// 1 продажа
 

Alexey Volchanskiy:
Так у тебя в комменте стоит управляющий символ "\n " - это символ перевода строки. Если его убрать, многострочия не будет.

这是个笑话。现在它在行尾添加了一个注释...而文字则向右跑去。;-)

 

晚上好。试图编写一个 关于天干和金俊交叉的简单EA。以下是代码。

空白的OnTick()

空白的OnTick()

{

TradeSignal_20()。

}


int TradeSignal_20()

{

int sig=0。


如果(h_ich==INVALID_HANDLE)

{

h_ich=iIchimoku(Symbol(),Period(),IKHtenkansen,IKHkijunsen,IKHsenkouspanb) 。

return(0);

}

否则

{

如果(CopyBuffer(h_ich,0,0,3,ich1_buffer)<2) 返回(0); // TENKANSEN_LINE

如果(CopyBuffer(h_ich,1,0,3,ich2_buffer)<2) 返回(0); // KIJUNSEN_LINE

if (!ArraySetAsSeries(ich1_buffer,true)) return(0);

if (!ArraySetAsSeries(ich2_buffer,true)) return(0);

}

if(ich1_buffer[1]>ich2_buffer[1]) sig=1;

else if(ich1_buffer[1]<ich2_buffer[1]) sig=-1;

否则sig=0。

if (ich1_buffer[1]>ich2_buffer[1])

if (ich1_buffer[2]<ich2_buffer[2])

Alert(Symbol()+": purchase")。

if (ich1_buffer[1]<ich2_buffer[1])

if (ich1_buffer[2]>ich2_buffer[2])

Alert(Symbol()+": sale")。

//---- 返回交易信号

返回(sig)。

}

//+------------------------------------------------------------------+

我怎样才能使警报只被调用一次,而不是不断调用?

 
Alexey Volchanskiy:

1.我在代码中没有看到任何关于最后20条的内容,请提供细节。

2.如何确定一个新条形图的第一个刻度线

3.如何关闭一个交易,而不管它是否被勾选?

你必须避免使用OnTick,而使用OnTimer,以1秒的间隔设置定时器,并检查其中的时间。计时器不依赖于蜱虫的到来。

在这里,我如何将收盘价 与过去20个条形图的最大值进行比较?而如果最后的价格等于或大于过去20条的最高价格,那么就有一个开仓的信号。
  

double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20,0)];


   
  if(Close[0] > SMMA && Close[0] > BB_UP && Close[0] >= HIGHEST)

  {
   TICKET = OrderSend(Symbol(),OP_BUY,LOT,Ask,0,Ask-StopLoss*Point,Ask+TakeProfit*Point,NULL,MAGIC,0,Blue);
   if(TICKET < 0)
      {
         Alert("Order Send failed, error # ", GetLastError() );
      } 
  }
 
first_may:

晚上好。试图编写一个 关于天干和金俊交叉的简单EA。以下是代码。

空白的OnTick()

空白的OnTick()

{

TradeSignal_20()。

我怎样才能使警报只被调用一次而不是一直被调用?
你不能按SRC按钮吗?
 
Imminence:
在这里,我如何将收盘价 与过去20个条形图的最大值进行比较?而如果最后的价格等于或大于过去20个柱子的最大值,那么就有一个开仓信号。
让我们看一下代码
double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20,0)];

  if(Close[0] > SMMA && Close[0] > BB_UP && Close[0] >= HIGHEST)

  {
***********

我认为问题出在对零条的引用上,也就是对当前条的引用。你应该定义一个新条形的开始,我在前面的答案中给出了这个定义,并且只在新条形的第一个刻度上进行所有的比较。并改变索引。我们需要确保最后一个收盘条不在iHighest中。而现在你在每个tick上都有一个对当前条形的引用被形成,结果将是最奇怪的。

double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20,2)];

  if(Close[1] > SMMA && Close[1] > BB_UP && Close[1] >= HIGHEST)

  {
***********

 
Alexey Volchanskiy:
让我们来看看以下代码

我认为问题出在对零条的引用上,也就是对当前条的引用。你需要定义一个新的柱状体的开始,我在之前的回复中引用了这一点,只有在新的柱状体的第一个刻度上才进行所有的比较。并改变索引。我们必须确保最后一个收盘条不在iHighest中。而现在你在每个tick上都有一个对当前条形的引用被形成,结果将是最奇怪的。

谢谢,似乎有帮助:)尽管我可以发誓我做了完全相同的事情,但它没有工作......。

你建议使用OnTimer(),但由于某些原因,它不与我合作。我研究了所有的帮助,没有发现任何明确的解释或例子,所以我被难住了。

也就是说,这个微不足道的代码没有被执行,尽管它都是在参考文献中指定的...在谷歌上搜索这个程序时,我发现他们说OnTimer()在测试中不起作用。

模式。尽管这个时刻似乎已经被mql5消除了。帮助理解它 :)谢谢!

int OnInit()
  {
//---
  bool  Timer = EventSetTimer(1);
  if(Timer != TRUE)
  Print(GetLastError()); 
//---
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
  EventKillTimer();   
  }
  
void OnTimer()
{
Print("It works");
}  
  
 

Imminence:

在谷歌上搜索这个程序时,我遇到他们说OnTimer()在测试模式下不起作用。它已经用mql5解决了。帮助我理解它)。谢谢!

对了,在MT4的测试器中,定时器不工作,而且没有记录!我写信给servicedesk,他们说他们绝不会这样做。我通过在OnTick中调用OnTimer来摆脱它。我把定时器设置为一秒钟。

// Возвращает true, если работает под тестером
bool IsRunOnTester()
{
    if(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_VISUAL_MODE) || MQLInfoInteger(MQL_OPTIMIZATION))
        return true;
    return false;    
}

MqlDateTime     TimeCurrStruct;

void OnTick()
{
    if(IsRunOnTester())
    {
        static datetime dt1 = 0, dt2 = 0;
        static bool tfirst = true;
        if(tfirst)
        {
            tfirst = false;
            dt1 = dt2 = TimeCurrent();
            return;
        }
    
        dt2 = TimeCurrent();
        for(datetime TimeTesterCurrent = dt1+1; TimeTesterCurrent <= dt2; TimeTesterCurrent++)
        {
            TimeToStruct(TimeTesterCurrent, TimeCurrStruct);
            OnTimer();
        }    
        dt1 = dt2;
    }
}

因此,如果在测试器中,刻度线的出现超过1次/秒,那么多余的刻度线就会被跳过;如果不那么频繁,就会产生1秒的时间倍数。这个时间在TimeCurrStruct结构中,而我的主类在任何模式下都只从这个结构中获取时间。在我看来,这是处理这个错误的唯一方法。这是一个函数,我删除了不必要的东西,只有肉))。

void OnTimer()
{
    string msg;
    if(!IsRunOnTester())
    {
        TimeToStruct(TimeCurrent(), TimeCurrStruct);
        SmartDsp.ReceiveTick(TimeCurrStruct);    // основной метод робота, в него передается структура со временем
    }
    else
    {
        SmartDsp.ReceiveTick(TimeCurrStruct);    
    }
}




 
Alexey Volchanskiy:
你不能按SRC按钮吗?
不清楚你说的是什么意思?