Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 790

 
Vladimir Karputov:

Нашел определение пункта. Разобрался, что это за зверь. Жалко, что определение я нашел не на mql5.

Пункт в экономике — минимальное изменение показателя, когда более мелких изменений для данного показателя не предусмотрено. Одному пункту соответствует единичное изменение самой последней публикуемой цифры показателя.

Спасибо за помощь.

 
pivomoe:

Пункт в экономике — минимальное изменение показателя, когда более мелких изменений для данного показателя не предусмотрено. Одному пункту соответствует единичное изменение самой последней публикуемой цифры показателя.

Еще проще: Point = 10^(-Digits). Ну и понятно, что цена, например, открытия позиции, может не равняться целому числу пунктов.

 
fxsaber:

 Ну и понятно, что цена, например, открытия позиции, может не равняться целому числу пунктов.

Как это ? Можно пример ?

 
pivomoe:

Как это ? Можно пример ?

На неттинге сделайте BUY 1 лота и, когда Ask-цена изменится, BUY 6 лотов.

#include <MT4Orders.mqh>

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

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

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

На неттинге сделайте BUY 1 лота и, когда Ask-цена изменится, BUY 6 лотов.

Интересная информация.
 

Прошу помощи по аналогу функции iHighest из MT4 - интересует вопрос для советника, как сделать наиболее правильно?

Я так понимаю, что нужно скопировать в массив значения, но получается, что б определить размер массива нужно подсчитать количество баров...

У меня задача зная две даты найти максимум бара.

Прошу подсказать, как подсчитать количество баров в заданном промежутке времени?

 
Aleksey Vyazmikin:

Прошу помощи по аналогу функции iHighest из MT4 - интересует вопрос для советника, как сделать наиболее правильно?

Я так понимаю, что нужно скопировать в массив значения, но получается, что б определить размер массива нужно подсчитать количество баров...

У меня задача зная две даты найти максимум бара.

Прошу подсказать, как подсчитать количество баров в заданном промежутке времени?

Вам нужно использовать 3-й параметр

Далее, после формирования массива найти максимум функцией  ArrayMaximum

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

Вам нужно использовать 3-й параметр

Далее, после формирования массива найти максимум функцией  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);
  }
//+------------------------------------------------------------------+