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

 
PokrovMT5:

马克西姆,你好!谢谢你的变体,我的变体几乎是一样的,它也可以工作,但阿列克谢-费多托夫 建议,我写道,有一个想法,如何纠正它?



如果你不介意重新绘制(例如,无论如何你都会重新计算,像现在这样)--从OnCalculate函数 中返回你想重新计算的地方,在你的例子中--前一个小时的条形图。

return rates_total-iBarShift(_Symbol,_Period,time[0]-TimeMinute(time[0])*60-TimeSeconds(time[0])-1 ); // 关于这个,写的是 "随手拈来,没有检查",以证明这个方法。

 
MakarFX 我做了,但这并没有解决这个问题,因为
// #property  copyright "Copyright © 2005, Yura Prokofiev"
// #property  link      "Yura.prokofiev@gmail.com"
#property  strict
#property  indicator_separate_window
#property  indicator_buffers 3
 
extern int      Barrs  = 10;     // Баров для расчета
extern string   simvol = "EURGBP";
double Buf_0[], Buf_1[], Buf_2[];

void OnInit()
{
   SetIndexStyle(0,DRAW_NONE);
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,2,Yellow);
   SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID,2,Red);
   IndicatorDigits((int)SymbolInfoInteger(simvol,SYMBOL_DIGITS));

   SetIndexBuffer(0,Buf_0);
   SetIndexBuffer(1,Buf_1);
   SetIndexBuffer(2,Buf_2);

   IndicatorShortName("Fisher "+simvol);
   SetIndexLabel(1,NULL);
   SetIndexLabel(2,NULL);
}

int start()
{
   int    i, limit, counted_bars=IndicatorCounted();
   double prev,current;
   double Value=0, Value1=0, Value2=0, Fish=0, Fish1=0, Fish2=0;
   double price, MinL=0, MaxH=0;

   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;

   for(i=0; i<limit; i++)
   {
      MaxH = iHigh(simvol,   0, iHighest(simvol,  0, MODE_HIGH,Barrs,i));
      MinL = iLow (simvol,   0, iLowest (simvol,  0, MODE_LOW, Barrs,i));
      price = (iHigh(simvol, 0, i) + iLow(simvol, 0, i))/2;
      if(MaxH != MinL)
      Value = 0.33*2*((price-MinL)/(MaxH-MinL)-0.5) + 0.67*Value1;     
      Value=MathMin(MathMax(Value,-0.999),0.999); 
      Buf_0[i]=0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1;
      Value1=Value;
      Fish1=Buf_0[i];
   }
   bool up=true;
   for(i=limit-2; i>=0; i--)
   {
      current=Buf_0[i];
      prev=Buf_0[i+1];
      if(((current<0)&&(prev>0))||(current<0))   up= false;    
      if(((current>0)&&(prev<0))||(current>0))   up= true;
      Buf_1[i]=0;  Buf_2[i]=0;
      if(!up) Buf_2[i]=current;
      else    Buf_1[i]=current;
   }
   return 0;
}

下面 是旧的,上面是新的

所用的图表时间框架是指标--零点所代表的时间框架。

 
YarTrade:

请告诉我如何在新条形图出现时重置缓冲区,但要使以前的数据不被抹去并显示在图表上。由于某些原因,我无法将缓冲区重置为零,当新的条形图出现,新的数据会叠加在旧的累积数据上我的代码有什么问题吗?谢谢你的澄清。

当一个新的条形图 出现时,终端将新的空项添加到缓冲区。在第3行......。6正是 它们归零。其他一切都被保存起来
 
STARIJ:
当一个新的条形图 出现时,终端会向缓冲区添加新的空元素。在第3行......。...6正好为零所有其他元素都被保留下来

为什么直方图中的条形图会随着新条形图 的出现而立即增长并继续增长,但下一个条形图出现时,前一个条形图也会增长?

 
YarTrade:

为什么在一个新的 柱状图出现后,柱状图中的柱状图紧接着有前一个柱状图的增长,然后继续增长,而下一个柱状图出现时,有前一个柱状图的增长?

你有一个总结
V2 = V1 + V2;
 
大家好,我自己也搞不清楚,是某种捣蛋鬼,虽然我可能是不专心。
int ticket_order=0;
void OnTick()
{
  if(OrdersTotal()==0)
   {
    // километр кода
    ticket_order=OrderSend(Symbol(),up_down,lots,Ask,3,0,0);
    }
    if(OrdersTotal()==1)
   {
     OrderSelect(ticket_order,SELECT_BY_TICKET);
     bool Ans=OrderModify(ticket_order,Price,SL,TP,0);
    }
}
     
   
我不知道该责备什么,也许我应该使用OrderModify()或OrderSelect通过引用发送票据,并以某种方式改变它?
 
ijonhson: 错误信息 wrong ticket(OrderModify())
有一个类似的。将第一个和第二个条件语句与内脏一起重新排列--可能有帮助。
 
STARIJ:

下面是旧的,上面是新的

所用图表的时间框架是指标--零点的位置

谢谢你,HUGE。这就是我想要的。
 
ijonhson:
向大家问好,我自己也搞不清楚。

这使我们更容易找到错误。

if ( OrderSelect(ticket_order,SELECT_BY_TICKET) )
  if ( OrderModify(ticket_order,Price,SL,TP,0) ) {}
但我认为在OrderSelect()之前,应该是tiket_order=(correct_ticket)
 
ijonhson:
大家好,我不能理解我自己,某种捣蛋鬼,虽然我可能不注意在这样一个连接的策略测试器中,错误的票据(OrderModify()),而且是在第n个订单上,而不是在第一个或第二个,我不知道该怪什么,也许在OrderModify(),或OrderSelect票据是通过引用和某种方式改变那里?
你通过票据选择订单,然后,在一公里的代码之后,试图修改它。但那时候可能已经关闭了。
原因: