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

 
yiduwi:

帮助,我如何找出趋势线的第一时间坐标

long  ObjectGetInteger( 
   long     chart_id,         // идентификатор графика 
   string   object_name,      // имя объекта 
   int      prop_id,          // идентификатор свойства 
   int      prop_modifier=0   // модификатор свойства, если требуется 
   );
 

为什么我不能这样做? 我在全局范围内 声明了一个变量 和一个数组,并希望立即将变量的值分配给数组。

int yo=6;
int masss[4]={0,0,yo,0};

而在函数中也有同样的问题,如果你把一个变量分配给一个参数,它就会失败

void Fulr(int ty=yo){}
 
Seric29:

为什么我不能这样做? 我在全局范围内 声明了一个变量 和一个数组,并希望立即将变量的值分配给数组。

和函数的问题一样,如果你把一个变量分配给一个参数,它就会失败

Документация по MQL5: Основы языка
Документация по MQL5: Основы языка
  • www.mql5.com
Язык MetaQuotes Language 5 (MQL5) является объектно-ориентированным языком программирования высокого уровня и предназначен для написания автоматических торговых стратегий, пользовательских технических индикаторов для анализа разнообразных финансовых рынков. Он позволяет не только писать разнообразные экспертные системы, предназначенные для...
 
Alekseu Fedotov:

谢谢你。

 
Artyom Trishkin:

显然,正常情况下是不可能说的。在C++中你可以这样做,我想这是因为mql4是通过描述符工作的,也就是说它不能直接访问内存,因为每个值都有一个地址,如果你访问这个地址你就可以发现那里有什么,这使得mql4过度静态化,限制了很多可能性,特别是与数组一起工作。

 

有没有可能在EA中制作两个定时器?不知道为什么,我以为OnTimer()是在一个单独的线程中调用的。但我试图在OnInit()中添加一个无限循环,并在它之前设置定时器,只有循环起作用,OnTimer()没有被调用。

我需要两个独立的动作在定时器上不断执行。每个人都有自己的时间间隔。如何实施,你知道吗?

 
leonerd:

有没有可能在EA中制作两个定时器?不知道为什么,我以为OnTimer()是在一个单独的线程中调用的。但我试图在OnInit()中添加一个无限循环,并在它之前设置定时器,只有循环起作用,OnTimer()没有被调用。

我需要两个独立的动作在定时器上不断执行。每个人都有自己的时间间隔。如何实施,你知道吗?

例如:数到一百,执行第一个代码,数到一百五十,执行第二个代码。但从好的方面来说,你应该让自己成为一个多聚体类。
 
Artyom Trishkin:

在这个主题中,我想开始帮助那些真正想了解和学习新的MQL4的编程,并想轻松切换到MQL5的人--这些语言非常相似。

这个博客将是一个讨论问题的好地方,他们的解决方案的算法和任何其他有关MT编程的问题,以这种或那种方式。

我希望我们论坛的其他有经验的成员能加入讨论,支部会让大家感兴趣。

下午好。我正在写一个试用的专家顾问,用于自学和实践经验。现在它可以接收来自指标的信号,并具有开立买入和卖出头寸的功能(Open_BUY_SELL())。我根据CodeBase中发布的一些脚本制作了这个函数。

问题是--我可以请这个主题中的知识分子检查这个代码是否繁琐吗????

我在这些地方有特别的疑虑和恐惧。

    m_trade         = new CTrade();
    m_symbol        = new CSymbolInfo();   
    m_position_info = new CPositionInfo();   
    m_account       = new CAccountInfo();
    
    m_symbol.Name(Symbol());
    m_symbol.RefreshRates();

把这个写在一个函数里面合适吗?是否值得把它移到OnInit()?我用两个脚本做了这个功能,文件夹在帖子里

CEngine        engine;
CTrade         trade;
CPositionInfo  apos;
CSymbolInfo    asymbol;

CTrade         *m_trade;
CSymbolInfo    *m_symbol;
CPositionInfo  *m_position_info; 
CAccountInfo   *m_account;

这个地方也很混乱,如果我理解正确的话--相同类别的对象相互重复。我只是在使用指标的过程中留下了一些声明,还有一些声明是在将脚本重新制作成一个函数后留下的。


我还没有把函数与信号连接起来,我想先了解和清理一下代码。我明白我在某个地方犯了错误,但我仍然缺乏知识和经验,无法了解究竟在哪里以及如何使其正确。

请支持。

 

附上文件 - EA,两个脚本和指标。

编译器不会骂人,没有错误可找,只有一些战略/战术考虑,即这样做是否可以,如果是错的,应该怎么做。

请。

附加的文件:
 
Artyom Trishkin:
但在一个好的方面--类多聚物需要使。

你不能把简单的任务复杂化!...说,我闲来无事就把新的酒吧 定义功能包装成一个类))))

说到点子上了。

leonerd:

有没有可能在一个EA中制作两个定时器?不知道为什么,我以为OnTimer()是在一个单独的线程中调用的。但我试图在OnInit()中添加一个无限循环,并在它之前设置定时器,只有循环起作用,OnTimer()没有被调用。

我需要两个独立的动作在一个定时器上不断执行。每个人都有自己的时间间隔。如何实施,你知道吗?


#property strict
//--- input parameters
input int      Timer1=13;
input int      Timer2=21;
static int timer1=0,timer2=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   EventSetTimer(1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if((timer1++)>Timer1) { timer1 = 0; Print("Timer №1"); }
   if((timer2++)>Timer2) { timer2 = 0; Print("Timer №2"); }
  }
//+------------------------------------------------------------------+
原因: