初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1478

 
MrBrooklin #:

你到底不明白什么?如何创建 EA 初始化函数?那就试着学习一下这篇初学者文章 吧。

弗拉基米尔

初始化是什么意思?))))) 这对一个人来说并不清楚)))))

 
Valeriy Yastremskiy #:

您说的 initialise))))) 是什么意思?我不太清楚)))))。

晚上好,瓦列里!我们打开这篇文章,首先看到的是一段简短的描述:

Далее идет функция инициализации советника. Это функция вызывается первой после запуска советника или смены графика и вызывается только один раз.

Этот раздел - лучшее место для проведения проверок, чтобы убедиться в правильности работы нашего советника.

Например, можно проверить, достаточно ли баров на графике для работы нашего советника и т.п.

Также это лучшее место для получения хэндлов технических индикаторов, которые будут использоваться (в нашем случае это индикаторы ADX и Moving Average).

然后是更详细的描述:

int OnInit()
  {
//--- Получить хэндл индикатора ADX
   adxHandle=iADX(NULL,0,ADX_Period);
//--- Получить хэндл индикатора Moving Average
   maHandle=iMA(_Symbol,_Period,MA_Period,0,MODE_EMA,PRICE_CLOSE);
//--- Нужно проверить, не были ли возвращены значения Invalid Handle
   if(adxHandle<0 || maHandle<0)
     {
      Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");
     }

一般来说,他至少应该先读一下这篇文章。))

弗拉基米尔

 

大家好!

我正在继续自学,又遇到了困惑。下面是脚本代码:

//+------------------------------------------------------------------+
//| Input variables                                                  |
//+------------------------------------------------------------------+
input uchar candles = 60;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   MqlRates price_array[];
   double price_low[];
   ArraySetAsSeries(price_low, true);
   ArraySetAsSeries(price_array, true);
   int copy_low = CopyLow(_Symbol, _Period, 0, candles, price_low);
   if(copy_low > 0)
     {
      int candle_low = ArrayMinimum(price_low, 0, candles);
      int Data = CopyRates(_Symbol, _Period, 0, candles, price_array);
      ObjectCreate(0, "UpwardTrendline", OBJ_TREND, 0, price_array[candle_low].time, price_array[candle_low].low,
                   price_array[0].time, price_array[0].low,0);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_COLOR, Blue);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_WIDTH, 3);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_RAY_RIGHT, true);
     }
  }
//+------------------------------------------------------------------+

脚本应该绘制一条趋势线段。为此,我设置了初始点和第二个点来绘制这条线段。文档中还说创建趋势线需要两个锚点。我认为我已经完成了所有应该完成的操作。根据我的理解,第二个点也是一个极值点,但由于某些原因,它绘制的不是线段,而是一条射线。


您能告诉我我错在哪里了吗?

弗拉基米尔

 

MrBrooklin #:
     

      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_COLOR, Blue);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_WIDTH, 3);
      ObjectSetInteger(0, "UpwardTrendline", OBJPROP_RAY_RIGHT, true);
ObjectSetInteger(0, "UpwardTrendline", OBJPROP_RAY_RIGHT, false);
 
Artyom Trishkin #:

谢谢你,阿尔乔姆!天哪,我还没有足够的智慧来理解如此简单明了的事情。上帝保佑您

弗拉基米尔

 

大家早上好,心情不错!

就是这样"我来了,你的屋顶!"这就是我我运行脚本

//+------------------------------------------------------------------+
//|                                              Count_Pos (v.2).mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Calculate positions Buy and Sell                                 |
//+------------------------------------------------------------------+
void Calc_Pos(uint pos_buy,uint pos_sell)
  {
   for(int i=0; i<PositionsTotal(); i++)
     {
      PositionGetSymbol(i);
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
         pos_buy++;
      if(
         PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
         pos_sell++;
     }
   Print("pos_buy ",pos_buy);
   Print("pos_sell ",pos_sell);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   uint count_buy=0, count_sell=0;
   Calc_Pos(count_buy,count_sell);
   Print("По символу ",_Symbol," открыто: ",count_buy," длинных позиций");
   Print("По символу ",_Symbol," открыто: ",count_sell," коротких позиций");
  }
//+------------------------------------------------------------------+

我得到了这个

2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  pos_buy 0
2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  pos_sell 2
2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  По символу EURUSDrfd открыто: 0 длинных позиций
2023.11.22 07:59:29.375 Count_Pos (v.2) (EURUSDrfd,M1)  По символу EURUSDrfd открыто: 0 коротких позиций

应该有两个空仓您能告诉我哪里出错了吗?

敬上,弗拉基米尔。

 
MrBrooklin #:

大家早上好,心情不错!

就是这样"我来了,你的屋顶!"这就是我我在写剧本

我得到这个

应该有两个空仓您能告诉我哪里出错了吗?

敬上,弗拉基米尔。

最后两次打印

输出的是变量

uint count_buy=0, count_sell=0;


也就是说,一切都按编写的程序运行--没有奇迹发生。

 
Alexander Sevastyanov #:

最后两幅印刷品

输出变量的值

的值,这些变量已经初始化,但没有进一步赋值。
也就是说,一切都按照写入的程序运行--没有奇迹发生。

你好,亚历山大。这正是我感到困惑的地方。应该赋值什么?我认为 Calc_Pos(count_buy,countsell)函数应该有效,还是我理解错了?

敬上,弗拉基米尔。

 
MrBrooklin #:

你好,亚历山大。这就是我被难住的地方。应该分配什么?我认为函数 Calc_Pos(count_buy,countsell)应该有效,还是我理解错了?

敬上,弗拉基米尔。

1.您声明并初始化了两个变量。

uint count_buy=0, count_sell=0;

2.将它们的值传递给函数。

Calc_Pos(count_buy,count_sell);


然后输出这些变量的值。但是它们在任何地方都没有改变,
,打印出的值都是 0。一切正常。

P.S. 尝试找出你的计划:你可以将这两个变量声明为全局变量。
例如,像这样:

//+------------------------------------------------------------------+
//|                                              Count_Pos (v.2).mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

   uint pos_buy=0, pos_sell=0;  // это глобальные переменные

//+------------------------------------------------------------------+
//| Calculate positions Buy and Sell                                 |
//+------------------------------------------------------------------+
void Calc_Pos()
  {
   for(int i=0; i<PositionsTotal(); i++)
     {
      PositionGetSymbol(i);
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
         pos_buy++;
      if(
         PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
         pos_sell++;
     }
   Print("pos_buy ",pos_buy);
   Print("pos_sell ",pos_sell);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   Calc_Pos();
   Print("По символу ",_Symbol," открыто: ",pos_buy," длинных позиций");
   Print("По символу ",_Symbol," открыто: ",pos_sell," коротких позиций");
  }
//+------------------------------------------------------------------+
 
Alexander Sevastyanov #:

1.你声明并初始化了两个变量。

2.将它们的值传递给函数。


然后输出这些变量的值。但它们在任何地方都没有改变,
,并分别以 0 打印出来。一切正常。

附注:我想知道你的计划:你可以将这两个变量声明为全局变量。
例如,像这样:

非常感谢,亚历山大。你的修改让代码正常工作了。老实说,我自己也有三处困惑。我需要重新学习向函数传递参数。显然,我在这里完全理解错了。

再见,弗拉基米尔。