1

三部分问题:

  1. 如何按名称在图表上查找 2 条用户创建的水平线并返回每条的价格。
  2. 然后确定价格最近穿过哪条 HLine 以确定趋势方向。
  3. 根据价格和方向计算斐波那契水平
4

3 回答 3

2
double value = ObjectGetDouble(0,nameOfHLine,OBJPROP_PRICE1);

如果你有对象的名称,这是你的价值,如果你没有它 - 需要遍历所有对象:

 string name;
 for(int i=ObjectsTotal()-1;i>=0;i--){
    name = ObjectName(i);
    if(ObjectType(name)!=OBJ_HLINE) continue;
 }
于 2017-06-08T16:26:40.760 回答
1

可以由用户编辑和打印斐波那契水平的斐波那契对象的工作示例。

#include <ChartObjects/ChartObjectsFibo.mqh>
CChartObjectFibo *Fibo;

int OnInit()
    {
     Fibo = new CChartObjectFibo();
     #Create object and set some defaults
     if(!Fibo.Create(0,"Fibonacci",0,Time[5],Open[5],Time[0],Open[0]))
     {
            return(INIT_FAILED);
     }
     # Allow user to drag object
     Fibo.Selectable(true);
     return(INIT_SUCCEEDED);
    }

void OnDeinit(const int reason)
    {
     delete Fibo;
    }

void OnTick()
    {
     string level_description;
     double level_value;
     string printString="Fibonacci Levels - ";
     # Get the two anchor prices
     double p1 = Fibo.GetDouble(OBJPROP_PRICE,0);
     double p2 = Fibo.GetDouble(OBJPROP_PRICE,1);
     # Calculate range
     double range=MathAbs(p1-p2);
     for(int i=0;i<Fibo.LevelsCount();i++)
     {
            level_description=Fibo.LevelDescription(i);
            # Calculate price of level
            level_value=(p2>p1)?p2-range*Fibo.LevelValue(i):p2+range*Fibo.LevelValue(i);
            printString=StringFormat("%s %s:%.5f",printString,level_description,level_value);
     }
     Print(printString);
    }
于 2017-06-08T17:02:01.660 回答
1

很难准确地理解你在追求什么,不确定你是想找到图形对象还是仅仅根据价格计算水平。假设您有两条水平线的价格,可以使用以下结构和函数来计算斐波那契水平。(价格 1 在时间上早于价格 2)。

根据此处找到的公式计算

struct FibLevel {
    double retrace38;
    double retrace50;
    double retrace61;
    double extension61;
    double extension100;
    double extension138;
    double extension161;
};

void FibLevel(double price1, double price2,FibLevel &fiblevel)
{
    double range = MathAbs(price1-price2);
    fiblevel.retrace38   =(price1<price2)?price2-range*0.382:price1+range*0.382;
    fiblevel.retrace50   =(price1<price2)?price2-range*0.500:price1+range*0.500;
    fiblevel.retrace61   =(price1<price2)?price2-range*0.618:price1+range*0.618;
    fiblevel.extension61 =(price1<price2)?price2+range*0.618:price1-range*0.618;
    fiblevel.extension100=(price1<price2)?price2+range      :price1-range;
    fiblevel.extension138=(price1<price2)?price2+range*1.382:price1-range*1.382;
    fiblevel.extension161=(price1<price2)?price2+range*1.618:price1-range*1.618;   
}
于 2017-06-08T13:12:50.767 回答