Функция распределения рыночных данных не является гауссовой, скорее она похожа на распределение синусоподобной волны. Поскольку большинство индикаторов базируются на предположении о нормальном распределении цен, их нужно "скорректировать". Решением является использование преобразования Фишера, которое преобразует данные таким образом, чтобы они имели распределение, близкое к нормальному. В статье рассмотрена теория прямого и обратного преобразования Фишера и ее применение в трейдинге, разработан модуль торговых сигналов.
#include <Expert\Signal\SignalMA.mqh>
CSignalMA SignalMA;
int TickCount;
string Str;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
TickCount=0;
SignalMA.Symbol(Symbol());
SignalMA.Period(PERIOD_H1);
SignalMA.Weight(0.5);
SignalMA.PeriodMA(20);
SignalMA.Shift(0);
SignalMA.Method(MODE_SMA);
SignalMA.Applied(PRICE_CLOSE);
return(0);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
TickCount++;
Str = "LongCondition = " + IntegerToString(SignalMA.LongCondition())+"; "+IntegerToString(TickCount)+ "\n";
Str = Str + "ShortCondition = " + IntegerToString(SignalMA.ShortCondition())+"; "+IntegerToString(TickCount);
Comment(Str);
}
//+------------------------------------------------------------------+
2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Period: 禁止改变时间框架
2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Symbol: 禁止更改符号。
我可以在Wizard EAs之外单独使用交易信号模块 吗?为测试目的,我写了
#include <Expert\Signal\SignalMA.mqh>
CSignalMA SignalMA;
int TickCount;
string Str;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
TickCount=0;
SignalMA.Symbol(Symbol());
SignalMA.Period(PERIOD_H1);
SignalMA.Weight(0.5);
SignalMA.PeriodMA(20);
SignalMA.Shift(0);
SignalMA.Method(MODE_SMA);
SignalMA.Applied(PRICE_CLOSE);
return(0);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
TickCount++;
Str = "LongCondition = " + IntegerToString(SignalMA.LongCondition())+"; "+IntegerToString(TickCount)+ "\n";
Str = Str + "ShortCondition = " + IntegerToString(SignalMA.ShortCondition())+"; "+IntegerToString(TickCount);
Comment(Str);
}
//+------------------------------------------------------------------+
2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Period: 禁止改变时间框架
2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Symbol: 禁止更改符号。
下面的代码。
每次调用该函数 时,都会调用标签的构造函数。
通过以下代码:在第一种情况下,指标被设置,在第二种情况下,它没有被设置(用斜线切换)。
这个库中的第二个选项输出为0,其他功能似乎都能工作。
对于下一个代码:在第一种情况下,指标被设置,在第二种情况下,它不是(用斜线切换)。
据我所知,目前这三个参数都是强制性的。
因此,你必须指定窗口编号(变体:0-主窗口,ChartIndicatorsTotal() -新窗口,0到ChartIndicatorsTotal()-1-现有窗口)。
这就是不出错的原因,是不好的。
对于这个库来说,第二个选项的输出是0。 所有其他的功能似乎都能工作。
可能在获得价格刷新之前应该使用(至少是RefreshRates)。
右边的变体应该是这样的
谢谢你,在指定刷新后,它真的与Bid一起工作。
但是指标的输出,使用库,需要2个参数,一个子窗口和一个句柄。 否则它说参数的数量是错误的,我想不出来,因为库使用相同的ChartIndicatorAdd。
谢谢你,在指定刷新后,它真的与Bid一起工作。
但是指标的输出,使用库,需要2个参数,一个子窗口和一个句柄。 否则它说参数的数量是错误的,我想不出来,因为库使用相同的ChartIndicatorAdd。
使用该库需要2个参数。图表和子窗口。
没有手柄?那么系统如何知道使用什么转盘呢? ......到目前为止,我一直相信所写的内容 :)基材和手柄。
没有手柄?系统将如何知道使用哪个指标? 到目前为止,我一直信任这些文本 :)子窗口和手柄。
关于图书馆(来自课堂帮助)
指示器添加
在指定的图表窗口中添加一个具有指定句柄的指标。
关于ChartIndicatorAdd 的直接工作。
图表指示器添加
在指定的图表窗口中添加一个具有指定句柄的指标。
至于CChart 类。
为了避免不必要的问题,我们试图遵循三个基本规则。
1.我们看源代码,如果有不清楚的地方就参考文档(源代码总是告诉我们 "真相",但文档也会撒谎)。
2.如果OOP的实现对我们来说很重要,我们就从某个特定的类的描述开始,一直到 "直接实现者"。如果 "实际工作 "很重要,OOP应该最后学习(对代码的向下/向上检查)。
3.如果在阅读了文件和资料后,有什么不清楚的地方,我们就到论坛去。
直接在类中实现IndicatorAdd方法
如果你看一下源代码,就会发现该方法获得了子窗口和句柄(如帮助中指出的),第三个参数来自于存储在类本身的数据(我指的是图形ID)。