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

 
Artyom Trishkin #:

第一次调用CopyRates()启动了历史数据交换(一个星期不运行,你又会得到同样的结果,好吧,也许不是一个星期,而是一些时间)。
你只需要检查服务器上有多少数据,并与专家顾问的可用数量进行比较。如果低于要求--将EA留到下一次打勾。在下一次打勾时,再次检查。如果在一定数量的尝试中没有获得所需的历史量--那么这个错误应该按要求进行处理。

谢谢你提供的信息!

如果您有时间,请告知如何纠正:

在历史上N个蜡烛前设置了两个相反的目标:Close[N]+50*Point 和 Close[N]-50*Point。
然后有一个条件,即价格应该达到其中一个目标(如果(High[i]>Close[N]+50*Point)或(如果(Low[i]<Close[N]-50*Point)
当条件得到满足时,从Close[N]
到High[i]的距离被写进x[high]=High[i]数组。
然后在任何时候都会随机抛给任何一个图形。

而当通过Print(x[high]) 检查时,10个值中有1-2个显示小于50!一个有12个,另一个有49个。虽然,严格说来是+50*点。8-9个是正确的(超过50),1-2个是不正常的。这不是通过测试器,而是用一个真实的图表,我放置了一个专家顾问(没有任何交易功能);它与历史记录一起工作,并显示不正确的结果。

,数值越大,这种错误就越少。我想这可能是传播的干扰,但是......。MT4似乎没有历史上的点差

 
Artis98 #:

亲爱的论坛用户和有经验的程序员,你们好我需要帮助来完成EA))。请告知如何在代码顾问中添加2个东西。

1.情况是这样的:我开了一个订单(第一笔),有TP和SL,有一定的手数(可能是0.01)。如果这个订单在获利时关闭 - 很好,没有任何变化。但是,如果这个(第一笔)订单在SL平仓,紧接着的下一笔订单(第二笔)会以2倍的手数(0.01*2=0.02)开仓。如果第二笔订单在止盈点平仓,那么下一笔订单(第三笔)将以普通手数开仓,即在前一笔(第一笔)在止盈点平仓后,下一笔订单(第二笔)只需要2倍的手数。如果第3笔订单连续第二次在SL中被关闭,手数将继续增加2倍,直到没有TP关闭。我希望我已经详细描述了需要添加的逻辑。


现在让我用一个例子来解释:假设我们有一个基本参数为T.p.+300,S.l.的订单,我们必须增加SL运动。- 500.价格向要求的方向移动,并从订单的开盘价中通过+100点。一旦价格从订单的开盘价达到+100,SL应该从基础的-500移动到+90。即:当价格达到与订单开盘价相比+100点时,我们通过设置S,L为+90点将订单转移到盈亏平衡点。之后,如果价格进一步向所需的方向发展并通过另一个+50点--S.L.被移动了50点=>它现在应该是在订单开盘价的+140点。即S.L.首先从它的基本位置移动到离订单开盘价+90点的位置,然后再移动,如果它通过了+50点(- 500 => + 90 => + 140 => + 190等)。如此这般,直到价格达到T.P。或当趋势反转并冲击S.L.时。


我希望我详细地描述了一切,我真的希望得到你的帮助,因为通过添加这些缺失的元素,专家顾问就可以准备好了))。如果你有任何问题,请问))))。我在下面粘贴了专家顾问的部分代码。

关于第一点:在你开仓之前,看看之前的仓位是如何关闭的。如果你采取SL,那么这批货应该是两倍。手数不应该增加前一个位置的一半,而是在设置中或代码中的某个地方设置。然后在开仓前,你将检查条件:如果前一个仓位被SL关闭,那么就用双倍的手数开仓。

至于第二个问题。很久以前,我在这个主题中发布了一个跟踪止损的样本。寻找它。最好是在我的信息资料中--你在那里找到它比在这里浏览100多页要快。然后在找到的例子的基础上,你将尝试创建你自己的拖网。

 
Artyom Trishkin #:

第一次调用CopyRates()启动了历史数据交换(一个星期不运行,你又会得到同样的结果,好吧,也许不是一个星期,而是一些时间)。
你只需要检查服务器上有多少数据,并与专家顾问的可用数量进行比较。如果低于要求--将EA留到下一次打勾。在下一次打勾时,再次检查。如果没有获得所需的尝试量--错误将按要求处理。

我们能否以编程方式获得加载的条数?

我自己只是看每个TF的报价档案中的日期,在计算时尽量不超过它们。

在这种形式下,这项任务可能是不必要的。 当加载适量的条形图时得到一个标志会更正确,但它可能永远不会为一个或另一个符号加载。

 
Artyom Trishkin #:

关于第一点:在开仓之前,要看一下前一个仓位的收盘情况如果通过SL,那么这批货应该是双倍的。手数不应该是前一个位置的手数的两倍,而应该是设置中或代码中某个地方的设置。然后在开仓前,你将检查条件:如果前一个仓位被SL关闭,那么就用双倍的手数开仓。

我想我已经在代码中做了修改。

//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
 double Lots()  // Расчет объема лота
  {
   int n=0;
   double Lotscount;
   double OL=Lot;
   
   
   if(Lot>0) return(LOT());          // "если во внешней переменной "Lot" стоит число больше 0 => будет фиксированный лот без авт. расчёта" 
   Lotscount=AccountFreeMargin()/10000;  // раcчёт лота - свободная маржа/9000 => 100/9000=0.01 лота 
   Lotscount=MathMin(15,MathMax(0.01,Lotscount));
    if(Lotscount<0.1) Lotscount=NormalizeDouble(Lotscount,2);
    else 
     {
       if(Lotscount<1) Lotscount=NormalizeDouble(Lotscount,1);
      else       Lotscount=NormalizeDouble(Lotscount,0);
     }
     
     for (int j = OrdersHistoryTotal()-1; j >= 0; j--)
   {
      if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
      {
          if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
            if (OrderProfit()<0) 
             {
               if (n==0) OL=NormalizeDouble(OrderLots()*K_Martin,DigitsLot);
               n++; 
               if (OrderProfit()>0) return(Lotscount);
            }
            else
            {
               if (n==0) {Comment("2");return(Lotscount);}
               else {Comment("3");return(OL);}
            }
         }
      }
   }
      return(Lotscount);
 }
//------------------------------------------------------------------
double LOT()
{
   int n=0;
   double OL=Lot;
   for (int j = OrdersHistoryTotal()-1; j >= 0; j--)
   {
      if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
            if (OrderProfit()<0) 
            {
               if (n==0) OL=NormalizeDouble(OrderLots()*K_Martin,DigitsLot);
               n++; 
               if (OrderProfit()>0) return(Lot);}
            }
            else
            {
               if (n==0) {Comment("2");return(Lot);}
               else {Comment("3");return(OL);}
            }
         }
      }
   }
   return(OL);
}

还是错了?另外,我不知道如何改变与地段有关的两件事。首先,一个双倍手数的订单应该只开一次,而且只在一个订单上(在有S.L.的订单之后的下一个订单)。第二,我不知道如何添加,就是让它在连续两个S.L.的情况下(连续两个订单被S.L.关闭),第三个订单的开仓手数不会再增加2(2*2*2),而是像第二个订单一样只增加一次(2*2)。

 
Artis98 #:

我想我已经在代码中改变了这一点。

或者说这是错的吗?另外,我不知道如何改变地段的两件事。第一种是只做一次双倍手数的订单,而且只做一个订单(在有S.L.的订单之后的下一个订单)。第二,我不知道如何添加,就是让它在连续两个S.L.的情况下(连续两个订单以S.L.关闭),第三个订单不会以再增加2的手数开仓(2*2*2),而是像第二个订单一样只开一次(2*2)。

你有两个订单类型--订单号1--普通手数的订单,以及订单号2--较大手数的订单。地段只按SL类型#1递增。

例如,在 "评论 "中保存订单类型。或者,最好是自己背下来。 把关于你的订单的一切都背下来是一个好习惯。

 
Maxim Kuznetsov #:

你有两个订单类型--订单号1--普通手数的订单,以及订单号2--增加手数的订单。地段只按SL类型#1递增。

例如,在 "评论 "中保存订单类型。或者,最好是自己背下来。 记住关于你的订单的一切,是一个好习惯。

我们不需要背诵任何东西(尤其是背诵需要进一步重建)。他只要知道以前的位置是如何关闭的就足够了。这就是全部。既不需要知道两个,也不需要知道三个,也不需要知道连续的一百个,也不需要知道一百个没有被止损关闭的,只需要知道最后的位置。如果它被止损平仓,那么下一次应该以双倍手数平仓。但是,这批货不应该是前一个位置的货的两倍,而是从程序中设定的正常货。然后,如果关闭的头寸没有达到止损,那么下一个头寸应该以相同的手数打开。如果通过止损平仓,那么下一个仓位的手数要加倍。这就是全部。你不需要知道其他事情。

 
Artyom Trishkin #:

他不需要背诵任何东西(尤其是背诵需要后续恢复)。它只需要知道过去的位置是如何关闭的。这就是全部。他不需要知道两个,或三个,或连续一百个,或没有在止损点关闭,而只需要知道过去的位置。如果它被止损平仓,那么下一次应该以双倍手数平仓。但是,这批货不应该是前一个位置的货的两倍,而是从程序中设定的正常货。然后,如果关闭的头寸没有达到止损,那么下一个头寸应该以相同的手数打开。如果通过止损平仓,那么下一个仓位的手数要加倍。这就是全部。你不需要知道其他事情。

不要告诉人们该怎么做。

你必须记住你的数据并与之一起工作

 
Artyom Trishkin #:

他所需要知道的是过去的位置如何关闭。这就是全部。你不需要知道连续两个、三个、一百个或没有连续在止损点关闭,只需要知道过去的位置。如果是在止损点平仓,那么下一次应该是双倍手数。 如果是在止损点平仓,那么下一次应该是双倍手数。

这就是我所需要的,这其实就是问题所在--如何在代码中写出它?

 

你好!
谁能告诉我如何强制编译器为MT4而非MT5编译?

如果文件的扩展名是*.mq4,我就没事,如果它的扩展名是*.mqh,那么编译器就会把它接受为*.mq5,并发生错误。

 
Sergey Zhukov #:

你好!
谁能告诉我如何强制编译器为MT4而非MT5编译?

如果文件的扩展名是*.mq4,我就没事,如果它的扩展名是*.mqh,那么编译器就会把它接受为*.mq5,并发生错误。

把文件给我们。这是新的东西,我以前从未听说过。