文章 "以 delta 指标为例开发股票交易量控制指标" - 页 9

 
Aleksey Vyazmikin:

如果我们以公开兴趣为标准,这就是你心目中的代码吗?

交易三角洲,我指的是我们对话的主题中的指标

那么,您是以浮动窗口(例如,最近 100 个)或升序(从某一日期开始的 n+1,例如,从当前日期开始的 n+1)的方式汇总这些 deltas,哪个时期的?为什么是这段时间?

嗯,是的,这段代码大约是这样的。如果是 %,则 * 100。这更适合机器人,从视觉上看,最好是看绝对值。

我为不同的战术设置了多个窗口。类似这样


 

假设期货交易开始活跃(对某些市场而言,全球决定资产价格,如 6B、6E、RB、CL、GC),只要它成为最接近的期货,就应从这一天开始总结 delta。

如果使用股票的 delta,确定起始点要困难得多。实际上,大多数系统(如 ClusterDelta)都采用一个固定的移动窗口,如 90 个交易日。 不过,如果仔细考虑,采用过去某个价格极值(如 30 天)作为参考点可能更为正确。

 

Kozitsyn、

祝贺您的出色工作!这是迄今为止最好的 Delta 指标,速度非常快。

我试着修改它,只用不同的颜色绘制买入/卖出 Delta 的正值(最好能比较柱状图条的大小),但没有成功,您能告诉我怎么做吗,或者贴出修改原始代码的位置?

还有一个问题,是否可以绘制垂直直方图而不是水平直方图?我试着用https://www.mql5.com/zh/articles/2714 绘制垂直直方图,但没有绘出任何值,事实上,我试着在垂直直方图中绘出体积值,也没有绘出任何体积王(我用 NormalizeDouble 将 long 转换为 double)。

非常感谢!

Statistical distributions in the form of histograms without indicator buffers and arrays
Statistical distributions in the form of histograms without indicator buffers and arrays
  • www.mql5.com
Histograms allow researchers to visually evaluate the distribution of statistical data grouped by the frequency of their penetration into a certain (predetermined) interval. Histograms and their use in the statistical data analysis are a well-studied topic with multiple articles devoted to it [1, 2, 3, 4, 5, 6, 7] and a large number of CodeBase...
[删除]  
frcardim:

科兹琴先生

祝贺您的出色工作!这是迄今为止最好的 Delta 指标,速度非常快。

谢谢!

我试着修改它,只用不同的颜色绘制买入/卖出 Delta 的正值(最好能比较柱状图条的大小),但没有成功,您能告诉我怎么做吗,或者贴出修改原始代码的位置?

用这个函数 替换 DisplayValues()函数

//+------------------------------------------------------------------+
//| Отображение значений индикатора|
//+------------------------------------------------------------------+
void DisplayValues(const int index,// Номер свечи
                   const long sumVolBuy,// Суммарный объем покупок
                   const long sumVolSell,          // Суммарный объем продаж
                   const int line                  // Номер строки вызова функции
                   )
  {
//--- Проверяем корректность номера свечи
   if(index<0) // Если некорректный номер
     {
      Print(__FUNCTION__,":ОШИБКА!Некорректный номер свечи '",index,"'");
      return;                                       // Выходим
     }
//--- Рассчитаем дельту
   const double delta=double(sumVolBuy-sumVolSell);
//--- Заносим значения в буферы
   //bufDelta[ index ]= delta; // Записываем значение дельты
   bufDelta[ index ]= (delta>0) ? delta : -delta;  // Записываем значение дельты
   bufDeltaColor[ index ] =(delta>0) ?  0 : 1;     // Записываем цвет значения
   bufBuyVol[ index ] = (double)sumVolBuy;         // Записываем сумму покупок
   bufSellVol[ index ]=(double)sumVolSell;         // Записываем сумму продаж
  }

还有一个问题,是否可以绘制垂直直方图而不是水平直方图?

在这个指标中是不可能的。
 

科齐岑先生


首先祝贺你干得好,干得好,干得好这正是我想要的。

然而,这个指标只是我愿望的一半。我想在delta 指标 上画一个波林带,以显示资金流大于正常行为的位置。我已经试过了,但我无法在同一个窗口看到布林线。您能帮我吗?

非常感谢


罗德里戈-皮门塔

[删除]  
rpimentaf:

你能帮帮我吗?

非常感谢


罗德里戈-皮门塔

抱歉,我不使用 BB。

您可以使用 Freelance 来完成您的任务。

 
Alexey Kozitsyn:

总的来说,在我们的市场上,使用刻度线和玻璃可以做很多很酷的事情。

我同意你的观点。我已经关注 Delta 很久了,但我并不常用它

你的指标很棒,我在周末也能用!

我在不到一分钟的时间框架内观察 delta,当价格突破当地高点时,市场上出现的不是止损(蓝色 delta),而是抛售。通常在这种情况下,价格会出现修正。

图画

嗯,就是这样,只是就事论事。

我的问题有所不同。我最近开始学习如何编写指标。我正在用科学的方法和复制粘贴法慢慢掌握它们。

我想写一个 delta 背离指标。这是卖出 AP 条形图(红色)的 delta 和下跌条形图的蓝色 delta 的代码。

在您的指标帮助下,通过 iCustom,我的指标可以正常运行。

但由于我正在学习,所以我有兴趣编写自己的指标。但我自己写的指标不工作(我已经三天三夜敲打它了,它就是不听话。如果不难的话,请告诉我错误出在哪里。

确定 delta 值的逻辑如下:由于我不需要当前条形图上的 delta 值,我决定在复制 CopyTicks 时使用上一条形图 OnCalculate, tick_volume[] 的刻痕量作为刻痕数来计算 delta 值。元编辑器进行了编译,但给出了警告:我在 tick volume long 中使用了不同的数据类型,而在 CopyTicks 中必须以 uint 指定刻度线的数量。 复制开始的时间取自相同的 time[]、

在测试器中测试时,它给出了 "Array out of range(数组超出范围)"的错误,我不知道它超出了什么限制,也不知道如何确定改变什么才能使指标不起作用,但至少可以消除这个错误。

下面是加法器的代码,请不要笑得太夸张。

#property indicator_chart_window 
#property indicator_buffers 5 
#property indicator_plots   1
  
#property indicator_label1  "Diver_handl" 
#property indicator_type1   DRAW_COLOR_CANDLES 
//--- 设置 2 种颜色来绘制蜡烛(它们存储在颜色缓冲器中) 
#property indicator_color1  clrRed,clrBlue
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  1 // 线条绘制厚度,此处不需要。

//--- 输入参数 
//--- 指示器缓冲区
double         ColorCandlesBuffer1[];//烛光缓冲器
double         ColorCandlesBuffer2[];
double         ColorCandlesBuffer3[];
double         ColorCandlesBuffer4[];
double         ColorCandlesColors[]; // 颜色缓冲区

string symbol;  //--- 字符名 
double _Delta;
//+------------------------------------------------------------------+ 
//| 自定义指示器初始化函数 
//+------------------------------------------------------------------+ 
int OnInit()
  {
//--- 指示器缓冲区映射 
   SetIndexBuffer(0,ColorCandlesBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ColorCandlesBuffer2,INDICATOR_DATA);
   SetIndexBuffer(2,ColorCandlesBuffer3,INDICATOR_DATA);
   SetIndexBuffer(3,ColorCandlesBuffer4,INDICATOR_DATA);
   SetIndexBuffer(4,ColorCandlesColors,INDICATOR_COLOR_INDEX);
   
//--- 空值(不会绘制的值) 
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   
//--- 绘制条形图的符号名称 
   symbol=_Symbol;
   
//--- 设置符号显示 
   PlotIndexSetString(0,PLOT_LABEL,symbol+" Open;"+symbol+" High;"+symbol+" Low;"+symbol+" Close");
   IndicatorSetString(INDICATOR_SHORTNAME,"Diver("+symbol+")");
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+ 
//| 自定义指标迭代函数 
//+------------------------------------------------------------------+ 
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int i,limit;
   int buf_size=rates_total-prev_calculated;
   if(rates_total<2)
      return(0);

   if(prev_calculated<3)
     {
      limit=1;
      // 用空值初始化数组
      ArrayInitialize(ColorCandlesBuffer1,EMPTY_VALUE);
      ArrayInitialize(ColorCandlesBuffer2,EMPTY_VALUE);
      ArrayInitialize(ColorCandlesBuffer3,EMPTY_VALUE);
      ArrayInitialize(ColorCandlesBuffer4,EMPTY_VALUE);
      ArrayInitialize(ColorCandlesColors,EMPTY_VALUE);
     }
   else limit=rates_total-1;

   MqlTick Ticks[];   //声明一个要填充刻度线数据的数组
   
   for(i=limit; i<rates_total-1; i++)
     {
      CopyTicks(Symbol(),Ticks,COPY_TICKS_TRADE,0,tick_volume[i]);  // 将刻度线数据复制到刻度线数组,其数量等于蜡烛刻度线的成交量 tick_volume[i]
      SetBarData(time[i],Ticks,i,_Delta,tick_volume[i]);// 地下室的功能 ↓

      if(open[i-1]<close[i-1] && _Delta<0)
        {
         ColorCandlesBuffer1[i-1]=open[i-1];
         ColorCandlesBuffer2[i-1]=high[i-1];
         ColorCandlesBuffer3[i-1]=low[i];
         ColorCandlesBuffer4[i-1]=close[i];
         ColorCandlesColors[i-1]=1;
        }
      else if(open[i]>close[i] && _Delta>0)
        {
         ColorCandlesBuffer1[i-1]=open[i-1];
         ColorCandlesBuffer2[i-1]=high[i-1];
         ColorCandlesBuffer3[i-1]=low[i];
         ColorCandlesBuffer4[i-1]=close[i];
         ColorCandlesColors[i-1]=0;
        }
      else
        {
         ColorCandlesBuffer1[i]=0.0;
         ColorCandlesBuffer2[i]=0.0;
         ColorCandlesBuffer3[i]=0.0;
         ColorCandlesBuffer4[i]=0.0;
        }
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
// 用适当的刻度线填充条形图
void SetBarData(const datetime TimeBar,const MqlTick &Ticks[],int &Pos,double &Delta,const long vol)
  {
  int i=0;
   while(i<vol)
     {
      MqlTick Tick=Ticks[Pos];  // 将刻度线数据缓冲区读数复制到变量中
      if(i>=vol)
         break;   // 当 i sanset 等于 tick volume 时 , vail †
      if((bool)(Tick.flags  &TICK_FLAG_BUY))  // 如果标记为买入,则将其添加到 Delta 值中
         Delta+=(double)Tick.volume;
      else if((bool)(Tick.flags  &TICK_FLAG_SELL)) // 如果标记为 Sell,则从三角洲值中减去
         Delta-=(double)Tick.volume;
      i++;
     }
   return;
  }
//+------------------------------------------------------------------+
我做了很多实验,因此可能会有以前实验的人工痕迹,表现为已声明但未使用的变量。
[删除]  
s22aa:

如果不难,请告诉我是什么错误。

我一眼看不出确切的出错位置,但首先请看看我的指标是如何处理 CopyTicks() 的。尤其是返回值 和处理可能出现的错误。

是的,如果发生数组超限...看看数组中有多少个值,以及你访问的是哪个元素。您还可以在接收数据后取消绘制第一个和最后一个值,以查看是否已接收到所有数据。

 
Alexey Kozitsyn:

看看我的指标是如何处理 CopyTicks() 的。

哇,好复杂。Ticks 既可以按时间间隔复制,也可以按数字复制。一般来说,系统的复制效果不会比 cosmonauts)))) 差。

我找到了我做的地方。

MqlTick Tick = Ticks[Pos];

我试图将一个数组复制到一个变量中。奇怪的是,为什么编译器没有反应,而在测试器中运行时,测试器却挂起了。

我再想想别的办法。
 
s22aa:

我正在尝试将一个数组复制到一个变量中。


不,你没有。没错我完全糊涂了明天早上我会好起来的明天,一切都会好起来的