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

 
Добрый день. Прошу помощи. Уже пару недель безуспешно пытаюсь заставить индикатор круглых уровней заставить (см.код) передавать их для использования в эксперте через iCustom. Прошу помочь поправить код.




#property indicator_chart_window

extern string H                     = " --- Mode_Settings ---";
extern bool   Show_00_50_Levels     = true;
extern bool   Show_20_80_Levels     = true;
extern color  Level_00_Color        = Lime;
extern color  Level_50_Color        = Gray;
extern color  Level_20_Color        = Red;
extern color  Level_80_Color        = Green;

double dXPoint = 1;
double Div = 0;
double i = 0;
double HighPrice = 0;
double LowPrice = 0;
int iDigits;
  
int start() 
{
   HighPrice = MathRound((High[iHighest(NULL, 0, MODE_HIGH, Bars + 300, 2)]+1) * Div);
   LowPrice = MathRound((Low[iLowest(NULL, 0, MODE_LOW, Bars + 300, 2)]-1) * Div);
  
  if(Show_00_50_Levels)
  {
   for (i = LowPrice; i <= HighPrice; i++) 
   {
      if (MathMod(i, 5) == 0.0) {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT);
            if(MathMod(i, 10) == 0.0)
            {
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_00_Color);
            }
            else
            {
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_50_Color);
            }
         }
      }
   }
   
  }
  
  if(Show_20_80_Levels)
  {
  
   for (i = LowPrice; i <= HighPrice; i++) 
   {
         
        if (StringSubstr(DoubleToStr(i/Div,iDigits), StringLen(DoubleToStr(i/Div,iDigits))-2, 2)=="20") {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT); 
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_20_Color);
            
            }
         }
        
         
         if (StringSubstr(DoubleToStr(i/Div,iDigits), StringLen(DoubleToStr(i/Div,iDigits))-2, 2)=="80") {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT);
           
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_80_Color);
            }
         }
         
   }
   
  }
  
   return (0);
}

int init() 
{
   iDigits = Digits;
   if(Digits==5 || Digits==3)dXPoint=10;
   if(Digits==3)  iDigits=2;
   if(Digits==5)  iDigits=4;
   
   Div = 0.1 / (Point*dXPoint);
   return (0);
}

int deinit()
{
   HighPrice = MathRound((High[iHighest(NULL, 0, MODE_HIGH, Bars + 300, 2)]+1) * Div);
   LowPrice = MathRound((Low[iLowest(NULL, 0, MODE_LOW, Bars + 300, 2)]-1) * Div);
   for (i = LowPrice; i <= HighPrice; i++) ObjectDelete("RoundPrice " + DoubleToStr(i, 0));
   return (0);
 
Aleksey Mavrin:
如果你说你的编程能力几乎为零,那么你为什么要承担这种非标准的任务,也许从简单的任务开始?或者提高你的基础知识?为你做这件事更容易,是的。

我并没有写:"让我成为一个指标"。我请求帮助。我没有必要完全掌握mql4。我只是在检查想法。我已经受够了EXCEL)。

 
Oleg Bondarev:

(我警告过你,我是个 "草泥马")

我是这样做的。

现在它画出了一个滴答图,但有一些断线。

我是在4个月内完成的。

断线表示Label1Buffer[ХХХ]中没有值。

第二个,我在上面写的,再来一次--指标缓冲区Label1Buffer)是由终端控制的,如果你看到一个新的bar,数值都会自动转移--在M1上运行代码并观察

ZS:不是黑客,而是正在努力自学的人!))))

 
Igor Makanu:

断线表示Label1Buffer[XXX]中没有值。

第二个,我在上面写的,再来一次--指标缓冲区Label1Buffer)是由终端控制的,如果出现新条形,那么数值都会自动转移--在M1上运行代码并观察

ZS:不是黑客,而是正在努力自学的人!))))

Label1Buffer[XXX] - 它是指3个复合数吗?


 
Oleg Bondarev:

Label1Buffer[XXX] - 这是一个3分量的数字吗?


不,我写的是我记得的第一封信。

那是项目的编号。

看看你的代码,你写的代码与我的循环相似,你将指标缓冲区Label1Buffer 移动了一个元素--注意每一个指标调用(每一个刻度)。

并在你转移 Label1Buffer 的内容后 ,将新的值分配给Label1Buffer[0]

其他元素的值是多少?一开始它们会有 "空值"(EMPTY_VALUE),然后你把它们移位一次,然后给....,赋予一个新值。然后,当一个新的条形图出现时, 终端本身将转移Label1Buffer的 所有值


一般来说,你的知识有轻微的转变,但尝试用指标简单地画出条形的收盘价,以下是代码

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot line1
#property indicator_label1  "line1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Input1=10;
//--- indicator buffers
double         line1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,line1Buffer);
   IndicatorDigits(Digits);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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;
//--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
   if(prev_calculated==0){
      limit=rates_total-1;
   }else
      limit=rates_total-prev_calculated+1; // или limit=rates_total-prev_calculated ; чтобы не перерисовывать бар №1
//--- Основной цикл расчета
//Print("limit = ",limit);
   for(i=limit; i>=0; i--){
      line1Buffer[i]=close[i];
    }
//---
  return(rates_total);

  }
//+------------------------------------------------------------------+
 
我听你的。我得考虑一下。谢谢你!
 

如何在Excel中记录数据?- MQL5。

Excel的文件格式是xlsx,但FileOpen函数 可以创建并处理txt和csv文件。


在OnTester中测试后,我需要从缓冲区卸载数据,这些缓冲区包含了每个tick打开时的不同数据历史,并在一个图表上输出所有交易的数据。
正如你所理解的,即使是一个交易,数据也会很多,更不用说所有的交易了 - 所以 "手动转移 "的选项并不适合。


你有什么建议?

 
Alexandr Sokolov:

如何将数据导入Excel?- MQL5。

Excel文件格式是xlsx,FileOpen函数 可以创建并处理txt和csv文件。


我需要在OnTester中测试后,从缓冲区中卸载数据,缓冲区中包含每个tick点开仓时的不同历史数据,然后在一个图表上显示所有交易数据。
正如你所理解的,即使是一个交易,数据也会很多,更不用说所有的交易了 - 所以 "手动转移 "的选项并不适合。


你有什么建议?

好吧,底线很简单--你不能用MQL5直接写入Excel,但你可以在Excel的 "数据">>"来自文本 "标签下从文本文件导入数据。

 
你好,我在完成一个探索者测试后得到一个关于不成功的对象的错误,而且我已经完全创建了所有的对象,据我所知,是在堆栈中创建的,也就是说没有新建。请解释这个问题。
 
Alexandr Sokolov:

你有什么建议?

写在.csv中并在Excel中打开