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

 
Vladimir Karputov:

找到了该条款的定义。弄清了这个野兽是什么。太糟糕了,我没有在mql5中找到这个定义。

经济学中的一个点 是一个指标的最小变化,当该指标没有设想的更小的变化。一个点 对应于该指标最近公布的数字中的一个变化。

谢谢你的帮助。

 
pivomoe:

经济 是指当某一指标没有更小的变化可以预见时,该指标的最小变化。一个点 对应于一个指标的最新公布数字的一个变化。

更简单的是:点=10^(-Digits)。而且很明显,比如说,开仓 的价格可能不等于整数点。

 
fxsaber:

而且可以理解的是,比如说开仓 的价格可能不等于整数的点。

怎么样?我可以给你举个例子吗?

 
pivomoe:

它是如何工作的?你能举个例子吗?

在净价交易中,买入1手,当卖出价格发生变化时,买入6手。

#include <MT4Orders.mqh>

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnInit()
{
  OrderSend(_Symbol, OP_BUY, 1, Ask, 100, 0, 0);
  Sleep(1 e4);
  OrderSend(_Symbol, OP_BUY, 6, Ask, 100, 0, 0);

  if (PositionSelect(_Symbol))
    Print(PositionGetDouble(POSITION_PRICE_OPEN));
}
 
fxsaber:

在净值上,买入1手,当卖出价变化时,买入6手。

有趣的信息。
 

请帮助解决MT4的iHighest功能--我对一个EA的问题感兴趣,如何做到正确的方法?

我明白你需要将数值复制到一个数组中,但事实证明,为了确定数组的大小,你需要计算条数...

我有一个任务,当我知道两个日期时,要找到最大的一条。

你能告诉我如何计算给定时间框架内的条数吗?

 
Aleksey Vyazmikin:

请帮助解决MT4的iHighest功能--我对一个EA的问题感兴趣,如何做到正确的方法?

我明白你需要将数值复制到一个数组中,但事实证明,为了确定数组的大小,你需要计算小节的数量...

我有一个任务,当我知道两个日期时,要找到最大的一条。

你能告诉我如何计算给定时间框架内的条数吗?

你需要使用第三个参数

然后,在形成阵列后,用ArrayMaximum 函数找到最大值

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyHigh
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyHigh
  • www.mql5.com
Функция получает в массив high_array исторические данные максимальных цен баров для указанной пары символ-период в указанном количестве. Необходимо отметить, что отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар. При копировании заранее неизвестного количества...
 
Vitaly Muzichenko:

你需要使用第三个参数

此外,在形成一个数组后,用函数ArrayMaximum 来寻找最大。


这是可以理解的,但在不知道条数的情况下,我不能使用ArrayMaximum 函数,因为我不知道数组的大小--你可以直接设置最大值,但我想要正确的解决方案。

 

我是这样做的。

MqlDateTime strDt;  
datetime         StartDt=TimeTradeServer();
datetime         StopDt=TimeTradeServer();
double          arrTimeD[];
TimeToStruct(StartDt,strDt);
   strDt.hour=0;
   strDt.min=0;
   strDt.sec=0;
StartDt=StructToTime(strDt);   
int BarsGo=iBarShift(_Symbol,0,StartDt,false); //Узнаем, индекс бара с начала временного периода (открытия дня)
ArrayFree(arrTimeD);
ArrayResize(arrTimeD,BarsGo);
CopyHigh(_Symbol,_Period,StartDt,StopDt,arrTimeD);
double Max=arrTimeD[ArrayMaximum(arrTimeD,0,BarsGo)];
Print("StartDt=",TimeToString(StartDt,TIME_DATE|TIME_MINUTES)," Max=",Max," BarsGo=",BarsGo);

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int iBarShift(string symbol,int tf,datetime time,bool exact=false)
  {
   if(time<0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[],time1;
   CopyTime(symbol,timeframe,0,1,Arr);
   time1=Arr[0];
   if(CopyTime(symbol,timeframe,time,time1,Arr)>0)
     {
      if(ArraySize(Arr)>2) return(ArraySize(Arr)-1);
      if(time<time1) return(1);
      else return(0);
     }
   else return(-1);
  }

但我不确定这是否是最好的选择。

 
//+------------------------------------------------------------------+
//|                                                          max.mq5 |
//|                                                   Copyright 2017 |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_plots 0
#property indicator_chart_window

double high_array[];
int CountBars;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   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[])
  {
//---
  datetime start_time = D'2017.11.03 04:00', 
           stop_time  = D'2017.11.03 12:00';
   
  if(CopyHigh(Symbol(),PERIOD_CURRENT,start_time,stop_time,high_array) < 0) return(0);
  
  CountBars = Bars(Symbol(),PERIOD_CURRENT,start_time,stop_time);
  
   Print( "high_array=",high_array[ArrayMaximum(high_array)],", CountBars=",CountBars ); // максимум во временном диапазоне, и количество баров
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+