新人的基本问题

gammaray  

大家好!

我应该马上指出,我曾试图在这里 的相关主题中提出这些问题,但不知为何,这个问题没有得到应有的关注。尽管在我看来,所触及的话题至少有一次触及/出现在许多人的脑海中。有点像常见问题中的问题(尽管我可能是错的)。我将在这里直接复制问题本身。

1.Mql4和Mql5(网站和编程语言)之间 有区别 有Metatrade 4和Metatrader 5分别有Mql4和Mql5。也有两个不同的对应网站。同时,我在MT4中看的那些专家顾问都是指向该网站的。哪一个更有意义?哪个论坛 "更有活力"?哪里是发布问题的最佳地点?不同版本的MT和Mql之间是否存在后向兼容性?我个人目前正分别在Mql4上编写我的MT4专家顾问。这是由于我用来测试演示的经纪人使用的是MT4。我如何识别我的专家顾问所使用的语言?我指的是只用扩展名(.mq4和.mq5)。如果我重新命名一个文件,它是否会被编译(同样,关于兼容性)?

2.动态外部专家顾问参数。是 否可以动态地改变专家顾问的可调参数?让我解释一下...例如,有一个外部参数extern bool a。如果是真的,应设置一个额外的参数extern int b。如果a=false,那么就不需要参数b了。有没有办法根据选定的当前值来显示/不显示?考虑到我找不到任何外部参数变化处理程序,也没有#if ...#endif,我怀疑它不能做...如果是这样,但你能否建议在这种情况下最好的方法,以便不使设置外部参数的过程超负荷?例如,我可能把a=false,忘记参数b没有被使用,但仍然把它纳入优化(虽然没有意义,只会浪费额外的时间)。而当只有一个这样的参数b时是一回事。但是,如果,例如,我做了一个枚举式的外部参数,并且有几个下拉式的TC变体。它们有一个共同的部分(因此在一个EA中实现它们是合乎逻辑的,而不是写几个),但也有不同的,有许多不同的参数。那么就很容易混淆哪些参数与选定的TS有关。

专家顾问的自动优化。I MHO,它是非常有用和有用的。我在这里发现了一篇关于在真实交易中自动优化交易机器人的 文章。然而,据我所知,使用的是MT的第二个实例,该实例从外部(从MT的一个运行实例)运行优化,优化结果以html形式从报告中读取。这是不太方便的,也是歪打正着。从逻辑上讲,我应该编写自己的优化函数/dll,并直接从专家顾问中运行它。因此,问题是这样的。据我了解,一个遗传优化算法被编入了策略测试器。我对这些算法的了解非常简略。但他们已经知道很长时间了,因此问题是--为什么要重新发明车轮?)有没有一种直接用于MT的现成的算法?也许它已经存在于终端本身的某个库中...也许有一个单独的源代码或准备好的dll。一般来说,请分享你在这个问题上的经验。

预先感谢你对这些问题的至少部分的回答。

Vladimir Karputov  
gammaray:

大家好!

我应该马上指出,我曾试图在这里 的相关主题中提出这些问题,但不知为何,这个问题没有得到应有的关注。尽管在我看来,所触及的话题至少有一次触及/出现在许多人的脑海中。有点像常见问题中的问题(尽管我可能是错的)。我将在这里直接复制问题本身。

1.Mql4和Mql5(网站和编程语言)之间 有区别 有Metatrade 4和Metatrader 5分别有Mql4和Mql5。也有两个不同的对应网站。同时,我在MT4中看的那些专家顾问都是指向该网站的。哪一个更有意义?哪个论坛 "更有活力"?哪里是发布问题的最佳地点?不同版本的MT和Mql之间是否存在后向兼容性?我个人目前正分别在Mql4上编写我的MT4专家顾问。这是因为我用来测试演示的经纪人使用的是MT4。

...

把我与MQL4有关的问题放在 "第四 "论坛是合乎逻辑的。虽然MQL5和MQL4之间的差异不是很明显。我们已经从MQL4搬到了 这里。因此,如果你想在这个论坛上问一个关于 "4 "的问题,你最好在主题标题中注明与MT4有关。这样会更清楚。


... 如何确定专家顾问所使用的语言?我的意思是,只通过扩展名(.mq4和.mq5)。而如果文件被重新命名,它是否会被编译(同样是关于兼容性)?

...

至于延期。有些文件在重命名后可以很好地编译并在MT4和MT5中工作--这里没有一般的秘诀。
gammaray  
Karputov Vladimir:

在 "第四 "论坛上讨论MQL4问题是有意义的。尽管MQL5和MQL4之间的差异并不明显。这是一个从MQL4的过渡。因此,如果你想在这个论坛上提出关于 "4 "的问题,你最好在主题标题中注明与MT4有关。这样会更清楚。


关于延期。如果你没有MT4或MT5账户,没有MT4或MT5文件,你可以把它作为交易机器人的前提条件,你不需要创建交易机器人或MT4文件。
只有第一个问题与mql4有关,其余的都是IMHO的mql4和mql5的共同问题。谢谢你对第一个问题的回答;)最重要的是,我对第二个问题感兴趣。而IMHO的第三个问题可能对所有的EA开发者来说都很有趣)
Vladimir Kazakov  
对于第二个问题,见input, sinput, ParametrGetRange(...), ParametrSetRange(...)。
gammaray  
Vladimir Kazakov:
对于第二个问题,见input, sinput, ParametrGetRange(...), ParametrSetRange(...)。

我没有问如何设置专家顾问的外部参数。我很久以前就学会了这样做(输入,外置)。我问如何以及是否有可能动态地改变设置中显示的参数集。 在mql中找不到ParametrGetRange和ParametrSetRange。这些不是内置功能?到哪里去找?

P.S. sinput的使用只能作为一种提示,即该参数不能在不与其他参数绑定的情况下自行优化。但我甚至不能根据我已经选择的参数动态地将输入变为sinput,以建议在优化中获取什么参数(在选择的参数下,什么参数是重要的),这样我就不必浪费时间去跑那些目前没有意义的参数了

Vladimir Kazakov  

在 "参数 "选项卡中不能以编程方式改变任何东西。你可以通过从OnInit() 返回INIT_PARAMETERS_INCORRECT 来跳过禁用参数设置。

你可以通过程序改变开始、步骤、停止和优化的权限:https://www.mql5.com/ru/docs/optimization_frames

Документация по MQL5: Работа с результатами оптимизации
Документация по MQL5: Работа с результатами оптимизации
  • www.mql5.com
Работа с результатами оптимизации - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
gammaray  
Vladimir Kazakov:

在参数标签中不能以编程方式改变任何东西。一个禁用的参数集不能被跳过--一个存根可以被打开,以便不进行不必要的计算。

你可以通过程序改变开始、步骤、停止和优化分辨率:https://www.mql5.com/ru/docs/optimization_frames

这些函数显然已经出现在mql5中,因为我在mql4的帮助中没有发现它们。然后,又有一个兼容性的问题。如果我在Metatrader 5中写了一个EA,我可以在Metatrader 4中使用它吗?这似乎不太可能。如果特别是我使用mql5中引入的新函数。mql5有运行优化的功能吗(这只是我的问题3的问题)?
doublezero  

这个话题被称为 "初学者的基本问题",作为一个初学者,我什么都不懂。好吧,这是我将得到我的基本问题的答案的地方(或者说希望如此)。我试图按照一步一步的指南来写 我的专家顾问。我在MKL5中被卡住了,当某个指标信号出现时,比如两个MAs的交叉点,或者布林线收窄或其他信号出现时,如何强行平仓(无需等待SL或TP)?一定有一个类似ClosePos()的函数,但它在哪里,我怎样才能得到它?我要求提供一份详细的代码,因为我自己并不了解其中的细微差别--我在MKL5中还是个婴儿。

gammaray  
doublezero:

这个话题被称为 "初学者的基本问题",作为一个初学者,我什么都不懂。好吧,这是我将得到我的基本问题的答案的地方(或者说希望如此)。我试图按照一步一步的指南来写 我的专家顾问。我在MKL5中被卡住了,当某个指标信号出现时,比如两个MAs的交叉点,或者布林线收窄或其他信号出现时,如何强行平仓(无需等待SL或TP)?一定有一个类似ClosePos()的函数,但它在哪里,我怎样才能得到它?我要求提供详细的代码片段,因为我自己并不了解其中的细微差别--在MKL5中还是个婴儿。

我自己也在处理这个问题,还不到一个月。问题是你是想自己做还是在论坛上问。简单的问题通常不问,因为它不是很好(你可以在帮助中寻找,在网上寻找现成的答案)。这就是为什么我问那些在这个月里出现的相当广泛的问题。至于你的问题...调用OrderClose函数。有很多关于其使用的例子。这是在内置的MACD样本中。这里是用于通过MACD信号平仓的代码(这里是实施追踪止损的代码样本)。


//--- it is important to enter the market correctly, but it is more important to exit it correctly...   
   for(cnt=0;cnt<total;cnt++)
     {
      if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
         continue;
      if(OrderType()<=OP_SELL &&   // check for opened position
         OrderSymbol()==Symbol())  // check for symbol
        {
         //--- long position is opened
         if(OrderType()==OP_BUY)
           {
            //--- should it be closed?
            if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
               MacdCurrent>(MACDCloseLevel*Point))
              {
               //--- close order and exit
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
                  Print("OrderClose error ",GetLastError());
               return;
              }
            //--- check for trailing stop
            if(TrailingStop>0)
              {
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     //--- modify order and exit
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))
                        Print("OrderModify error ",GetLastError());
                     return;
                    }
                 }
              }
           }
         else // go to short position
           {
            //--- should it be closed?
            if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
               MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))
              {
               //--- close order and exit
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
                  Print("OrderClose error ",GetLastError());
               return;
              }
            //--- check for trailing stop
            if(TrailingStop>0)
              {
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     //--- modify order and exit
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red))
                        Print("OrderModify error ",GetLastError());
                     return;
                    }
                 }
              }
           }
        }
     }


一般来说,只要在 "索引 "中输入 "订单 "一词,所有有关订单管理的功能都会显示在那里。
doublezero  
gammaray:

我自己做这个还不到一个月。问题是你是想自己做,还是想在论坛上问问题。我通常不问简单的问题,因为这其实并不合适(你可以在帮助台做一些挖掘,或在互联网上搜索答案)。这就是为什么我问那些在这个月里出现的相当广泛的问题。至于你的问题...调用OrderClose函数。有很多关于其使用的例子。这是在内置的MACD样本中。这是用于通过MACD信号关闭订单的代码(这里是如何实现追踪止损机制的示例代码)。



谢谢你这么快的答复!我想,这可能是由一个长期处理这种事情的人给出的。

除了OrderClose在MKL4中,但它在MKL5中没有。在标准库中 的 CTrade 类中只有PositionClose 函数 而且我根本不清楚如何从那里得到它。我认为,为此你必须以某种方式从代码中调用库,然后调用类 CTrade....总的来说,对我来说,这是一个黑暗的森林。我不打算研究MKL5,我只是决定将我相当成功的(对我来说)策略自动化,所以我只是开始按照步骤指示。现在我被卡住了...

gammaray  
doublezero:

谢谢你这么快的答复!我想这可能是来自于一个刚接触这个的人。

除了OrderClose是在MKL4中,但MKL5没有这个功能。在标准库中 的 CTrade 类中只有PositionClose 函数 而且我根本不清楚如何从那里得到它。我认为,为此你必须以某种方式从代码中调用库,然后调用类 CTrade....总而言之,这对我来说是一片黑暗的森林。我不打算研究MKL5,我只是决定将我相当成功的(对我来说)策略自动化,所以我只是开始按照步骤指示。现在我被卡住了...

在mql 5中搞砸了一些事情,我不想使用OrderSend,一切都在那里完成(包括关闭)。同样,MT5有相同的MACD样本。但它需要10倍的线...
Ошибка закрытия ордера
Ошибка закрытия ордера
  • www.mql5.com
Скажите а есть отдельная команда по закрытию позиции или только встречная позиция? - - Категория: эксперты форекс, торговые роботы и советники