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

 
Alexey Belyakov:
我改变了它,得到的错误是:" 'array_atr' - 无效的阵列访问 "


也许有些东西会有帮助 - 你只需要创建一个指标,而不是一个专家

- 专家顾问以同样的方式工作,但它将显示在测试器中

//+------------------------------------------------------------------+
//|                                                         тест.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot iATR
#property indicator_label1  "iATR"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrLightSeaGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- входные параметры
input int                  atr_period=14;          // период для вычисления
input string               symbol=" ";             // символ
input ENUM_TIMEFRAMES      period=PERIOD_CURRENT;  // таймфрейм
//--- индикаторный буфер
double iATRBuffer[];
//--- переменная для хранения хэндла индикатора iAC
int    handle;
//--- переменная для хранения
string name=symbol;
//--- имя индикатора на графике
string short_name;
//--- будем хранить количество значений в индикаторе Average True Range
int    bars_calculated=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- привязка массива к индикаторному буферу
   SetIndexBuffer(0,iATRBuffer,INDICATOR_DATA);
//--- определимся с символом, на котором строится индикатор
   name=symbol;
//--- удалим пробелы слева и справа
   StringTrimRight(name);
   StringTrimLeft(name);
//--- если после этого длина строки name нулевая
   if(StringLen(name)==0)
     {
      //--- возьмем символ с графика, на котором запущен индикатор
      name=_Symbol;
     }
//--- создадим хэндл индикатора
   handle=iATR(name,period,atr_period);
   if(handle==INVALID_HANDLE)
     {
      //--- сообщим о неудаче и выведем номер ошикби
      PrintFormat("Не удалось создать хэндл индикатора iATR для пары %s/%s, код ошибки %d",
                  name,
                  EnumToString(period),
                  GetLastError());
      //--- работа индикатора завершается досрочно
      return(INIT_FAILED);
     }
//--- покажем на какой паре символ/таймфрейм рассчитан индикатор Average True Range
   short_name=StringFormat("iATR(%s/%s, period=%d)",name,EnumToString(period),atr_period);
   IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- нормальное выполнение инициализации индикатора
//---
   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[])
  {
//---- проверка количества баров на достаточность для расчета
   if(BarsCalculated(handle)<rates_total
      ||rates_total<0)
      return(0);
//---- объявления локальных переменных
   int to_copy,limit;
//---- расчеты необходимого количества копируемых данных и
//стартового номера limit для цикла пересчета баров
   if(prev_calculated>rates_total || prev_calculated<=0)// проверка на первый старт расчета индикатора
     {
      to_copy=rates_total; // расчетное количество всех баров
      limit=rates_total-1; // стартовый номер для расчета всех баров
     }
   else
     {
      to_copy=rates_total-prev_calculated+1; // расчетное количество только новых баров
      limit=rates_total-prev_calculated; // стартовый номер для расчета новых баров
     }
//---- копируем вновь появившиеся данные в массивы
   if(CopyBuffer(handle,0,0,to_copy,iATRBuffer)<=0)
      return(0);
//---- индексация элементов в массивах как в таймсериях
   ArraySetAsSeries(iATRBuffer,true);
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Alexey Belyakov:
更改后得到错误:" 'array_atr' - 无效的阵列访问 "


一个数组元素 用'[]'来引用。

例如,对一个空元素的引用。

array_atr[0]
 
Vladimir Karputov:

一个数组元素 用'[]'来引用。

例如,对一个空元素的引用。


double array_atr[];   

int ATR14;

int OnInit()
  {
ATR14=iATR(NULL,PERIOD_CURRENT,14);
  return(0);   
  }
   
void OnDeinit(const int reason)
  {
//---  
  }

void OnTick()
{

CopyBuffer(ATR14,0,0,2,array_atr);

Comment(

      "ATR14==: ",DoubleToString((array_atr[1])*100000,0),"\n");

}
Vladimir 谢谢你!完成了!
 
Alexey Belyakov:


Vladimir 谢谢你!完成了!

我想弄清楚你想得到什么,我只走到这里,没有得到。

//+------------------------------------------------------------------+
//|                                              Alexey Belyakov.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade\Trade.mqh>
CTrade ExtTrade;
//---
int ATR14;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create ATR indicator and add it to collection
   ATR14=iATR(_Symbol,_Period,14);
   if(ATR14==INVALID_HANDLE)
     {
      printf("Error creating ATR indicator");
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   OnATR14();
  }
//+------------------------------------------------------------------+
//| refresh indicators                                               |
//+------------------------------------------------------------------+
void OnATR14()
  {
   MqlRates rt[2];
//--- go trading only for first ticks of new bar
   if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
     {
      Print("CopyRates of ",_Symbol," failed, no history");
      return;
     }
   if(rt[1].tick_volume>1)
      return;
//--- get current Moving Average
   double array_atr[1];
//--- get current ATR
   if(CopyBuffer(ATR14,0,0,1,array_atr)!=1)
     {
      Print("CopyBuffer from ATR failed, no data");
      return;
     }
   if(array_atr[0]>=0.00100 && rt[0].close>array_atr[0])
     {
      Print("ATR14==: BUY");
     }
   if(array_atr[0]<=0.00100 && rt[0].close>array_atr[0])
     {
      Print("ATR14==: SELL");
     }
  }
//+------------------------------------------------------------------+
 
你好!
我只是开始了解代码,所以请宽恕我在编程方面的文盲。
我无法应付mql5中这篇的翻译。

int init() 
   {
   parus = MarketInfo(Symbol(), MODE_SPREAD) * Point;
   if (IsTesting() == true) rf();
   if (IsTesting() == false) rm();
   return (0);
   }

我把MarketInfo改为SymbolInfoInteger,我得到的是--所以。

int init() 
   {
   parus = SymbolInfoInteger(Symbol(),SYMBOL_SPREAD_FLOAT) * Point;
   if (IsTesting() == true) rf();
   if (IsTesting() == false) rm();
   return (0);
   }

而我得到的是错误。

由于类型转换可能 造成的数据损失

';' -希望有 开放的小括号


请帮助我,告诉我它应该如何工作。





 
Sprut 185:
你好!
我只是开始了解一个代码,我请你宽恕我在编程方面的文盲。
我无法应付mql5中这篇的翻译。

我把MarketInfo改为SymbolInfoInteger,我得到的是--所以。

而我得到的是错误。

由于类型转换而可能 造成的数据损失

';' -希望有 开放的小括号


请帮助,并写出事实上应该是怎样的。

   parus = SymbolInfoInteger(Symbol(),SYMBOL_SPREAD) * Point();
   if(MQLInfoInteger(MQL_TESTER) == true) rf();
   if(MQLInfoInteger(MQL_TESTER) == false) rm();

或者像这样更好

   parus = SymbolInfoInteger(Symbol(),SYMBOL_SPREAD) * Point();
   if(MQLInfoInteger(MQL_TESTER)) rf();
    else rm();
 
Vitaly Muzichenko:

或者更好的是

非常感谢您的帮助 !


现在我搞不清楚为什么它这么说。

int user_0 = SymbolInfoInteger(Symbol(), SYMBOL_TRADE_STOPS_LEVEL);

由于类型转换而可能造成的数据损失

它有什么问题?


 
Sprut 185:
非常感谢您的帮助 !


现在我搞不清楚为什么它这么说。

由于类型转换而可能造成的数据损失

这里有什么问题吗?


长或公的 不是int。

Документация по MQL5: Получение рыночной информации / SymbolInfoInteger
Документация по MQL5: Получение рыночной информации / SymbolInfoInteger
  • www.mql5.com
SymbolInfoInteger - Получение рыночной информации - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Valeriy Yastremskiy:

多头或牛市 不进。

谢谢你想出了这个办法!!。

现在还不清楚--这里出了什么问题。

trendstep = "Tredstep start on" +Trendstep_start+ " order";

错误:从'数字'到'字符串'的隐式转换

奖牌有什么问题吗?


 
Sprut 185:
谢谢排序!!。

现在还不清楚--这里出了什么问题。

错误:从'数字'到'字符串'的隐式转换

奖牌有什么问题吗?


不是隐性转换。就是当你把字符串加到数字上时,数字就会被转换为字符串变量。而你需要一个显式的。希望trendstep有一个字符串类型。)))

trendstep = "Tredstep start on" +(string) Trendstep_start+ " order";
原因: