//+------------------------------------------------------------------+//| Fractals.mq5 |//| Copyright 2009-2017, MetaQuotes Software Corp. |//| http://www.mql5.com |//+------------------------------------------------------------------+#property copyright"2009-2017, MetaQuotes Software Corp."#property link"http://www.mql5.com"//---- indicator settings#property indicator_chart_window#property indicator_buffers2#property indicator_plots2#property indicator_type1DRAW_ARROW#property indicator_type2DRAW_ARROW#property indicator_color1 Gray
#property indicator_color2 Gray
#property indicator_label1"Fractal Up"#property indicator_label2"Fractal Down"bool high_f, low_f, lastIsUpper = true, lastIsLower = true;
int lastLowerIndex, lastUpperIndex;
//---- input datainputint period = 5;
int per = period;
//---- indicator buffersdouble ExtUpperBuffer[];
double ExtLowerBuffer[];
//--- 10 pixels upper from high priceint ExtArrowShift=-10;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+voidOnInit()
{
if(per % 2 == 0) per++; //период фракталов только нечетный//---- indicator buffers mappingSetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA);
SetIndexBuffer(1,ExtLowerBuffer,INDICATOR_DATA);
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---- sets first bar from what index will be drawnPlotIndexSetInteger(0,PLOT_ARROW,217);
PlotIndexSetInteger(1,PLOT_ARROW,218);
//---- arrow shifts when drawingPlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ExtArrowShift);
PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-ExtArrowShift);
//---- sets drawing line empty value--PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- initialization done
}
intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
int i,limit;
//---if(rates_total < per)
return(0);
//---if(prev_calculated < per + (per - 1) / 2)
{
limit = (per - 1) / 2;
//--- clean up arraysArrayInitialize(ExtUpperBuffer,EMPTY_VALUE);
ArrayInitialize(ExtLowerBuffer,EMPTY_VALUE);
}
else limit = rates_total - per;
for(i = limit; i < rates_total - (per + 1) / 2 && !IsStopped(); i++)
{
high_f = true; low_f = true;//с самого начала считаем что есть фрактал в i свечеfor(int g = 1; g < (per+1)/2; g++){//проверка на наличие фрактала (одновременной справа и слева от свечи с возможным фракталом)//---- Upper Fractalif(high[i-g] >= high[i] || high[i+g] > high[i]){//если одно из условий выполнено (high какой либо свечи справа или слева выше чем исследуемый), то фрактала сверху нет
ExtUpperBuffer[i] = EMPTY_VALUE;
high_f = false;
}
//---- Lower Fractalif(low[i-g] <= low[i] || low[i+g] < low[i]){ //если одно из условий выполнено, то фрактала снизу нет
ExtLowerBuffer[i] = EMPTY_VALUE;
low_f = false;
}
}
//устанавливаем верхнийif(high_f){//если фрактал все таки есть (из цикла-проверки выше)if(lastIsLower){//еси последний фрактал был нижний
ExtUpperBuffer[i] = high[i];//устанавливаем сверху
lastUpperIndex = i;//записываем индекс в буффере установленного
lastIsLower = false;//говорим что последний - не нижний
lastIsUpper = true;//а верхний
}else{
if(lastIsUpper){//если последний верхний (а мы пытаемся установить верхний)if(high[i] > ExtUpperBuffer[lastUpperIndex]){//если устанавливаем выше предыдущего
ExtUpperBuffer[lastUpperIndex] = EMPTY_VALUE;//удаляем предыдущий
ExtUpperBuffer[i] = high[i];//устанавливаем новый
lastUpperIndex = i;//записываем индекс нового
}
}
}
}
//аналогично для фрактала снизуif(low_f){
if(lastIsUpper){
ExtLowerBuffer[i] = low[i];
lastLowerIndex = i;
lastIsLower = true;
lastIsUpper = false;
}else{
if(lastIsLower){
if(low[i] < ExtLowerBuffer[lastLowerIndex]){
ExtLowerBuffer[lastLowerIndex] = EMPTY_VALUE;
ExtLowerBuffer[i] = low[i];
lastLowerIndex = i;
}
}
}
}
}
//--- OnCalculate done. Return new prev_calculated.return(rates_total);
}
//+------------------------------------------------------------------+
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Возвращает сумму лотов открытых позиций |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ( "" - любой символ, |//| NULL - текущий символ) |//| op - торговая операция ( -1 - любая позиция) |//| mn - MagicNumber ( -1 - любой магик) |//+----------------------------------------------------------------------------+double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) {
double l=0;
int i, k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
l+=OrderLots();
}
}
}
}
}
}
return(l);
}
你好!
是的,没有理由把时间翻译成字符串,因为时间是一个秒数。这个数字比字符串更容易和更快地工作。
你纠正了一件事,却毁了另一件事)。
在第二部分,而不是。
返回。
你在之前的尝试中,这句话是正确的。
谢谢你的答复!我已经试过这两个选项。
我看不出有什么问题--在停止时,它仍然会直接进入。
大声说出你的情况,你就会知道发生了什么事)
事实上,到处都有!=条件,即相反的>应该有,如果我正确理解你的意思。但所有的变体都运行了--仍在工作。
帮助理解逻辑,发现错误
对代码进行了详细的注释。
我需要它画出有周期的分形,有 "之 "字型的分形,使下边的上边的分形 依次进行,以此类推。
但结果是,重复的分形还是出现在了图表上
基数取自标准分形指标。下面的截图是第5期的重复分形图
如果不支持SYMBOL_SESSION_INTEREST,请告知如何在MQL4中获得未结头寸 的数量?谢谢你!
循环查看所有头寸,并计算其总成交量:OrderLots()
我不明白为什么要返回prev_calculated的某个值?
首先,它是如何计算的?
我不明白为什么要返回prev_calculated的某个值?
首先,它是如何计算的?
我不明白为什么要返回prev_calculated的某个值?
它甚至是如何计算的呢?
这是OnCalculate()在最后一次迭代时返回的值。这一点在文件中已明确说明。
应该注意OnCalculate()返回的值和第二个输入参数prev_calculated之间的关系。 当函数被调用时,参数prev_calculated包含了 OnCalculate()在 上一次 调用 时 返回的 值。 这允许在计算自定义指标时采用经济的算法,以避免对那些自上次调用此函数以来没有变化的条形图进行重复计算。
任务是找到具有最小闭合度的柱子
for(int x=0; x<=xBars -1; x++)
{
反++。
// 打印(Close[x],",",counter)。
int h =ArrayMinimum(Close[x])。
if(counter > 20) break;
}
编译员对Close说脏话