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

 
_new-rena:

такое (ниже) не работает, F_Path вбивал в проводник, клацал по энтер, файл открывается... А инфо по WinApi похоже на это?

Кто мешает флаг FILE_COMMON использовать при записи и чтении? Файл будет доступен всем терминалам, установленным в системе. Будет находиться в общей папке всех терминалов.

В МЕ Файл --> Открыть общую папку данных

 
artmedia70:

Кто мешает флаг FILE_COMMON использовать при записи и чтении? Файл будет доступен всем терминалам, установленным в системе. Будет находиться в общей папке всех терминалов.

В МЕ Файл --> Открыть общую папку данных

спасибо (!!!), попробую.
 

Здравствуйте, кто-нибудь сталкивался с такой проблемой при создании торгового запроса с параметрами:

если поставить вот такие параметры:

mrequest.action=TRADE_ACTION_DEAL;
mrequest.type_filling=ORDER_FILLING_FOK;

mrequest.type=ORDER_TYPE_BUY;

терминал сообщает что я указываю недопустимый способ mrequest.type_filling (политика исполнения ордера), если указать mrequest.type_filling=ORDER_FILLING_RETURN; то ордер открывается но закрыть его программно не получается, терминал сообщает что используется недопустимый метод. Советник запускаю на сервере бкс форекс, на других серверах все отлично. Кто-нибудь может написать политику исполнения которую можно использовать при разработке торговых роботов для указанного брокера? Спасибо.
 

Есть индикатор mq4 с функцией Alert.

Например:

//+------------------------------------------------------------------+
//|                                                    RSI-Alert.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_separate_window
//#property indicator_minimum 0
//#property indicator_maximum 100
#property indicator_buffers 3
#property indicator_color1 LightSeaGreen
#property indicator_color2 CLR_NONE
#property indicator_color3 CLR_NONE
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 1
#property indicator_style1 STYLE_SOLID
#property indicator_style2 STYLE_DOT
#property indicator_style3 STYLE_DOT
//---- input parameters
extern int RSIPeriod=48;
extern int ApplyTo=0;
extern bool AlertMode=true;
extern int OverBought=0;
extern int OverSold=0;
//---- buffers
double RSIBuffer[];
double RSIOBBuffer[];
double RSIOSBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- indicator lines
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,RSIBuffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,RSIOBBuffer);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,RSIOSBuffer);
//---- name for DataWindow and indicator subwindow label
   short_name="RSI-Alert("+RSIPeriod+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);
   SetIndexLabel(1,"OverBought");
   SetIndexLabel(2,"OverSold");
//----
   SetIndexDrawBegin(0,RSIPeriod);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Relative Strength Index                                          |
//+------------------------------------------------------------------+
int start()
  {
   int    i,counted_bars=IndicatorCounted();
//----
   if(Bars<=RSIPeriod) return(0);
//----
   i=Bars-RSIPeriod-1;
   if(counted_bars>=RSIPeriod) i=Bars-counted_bars-1;
   while(i>=0)
   {
      RSIBuffer[i]=iForce(NULL,0,RSIPeriod,1,0,i);
      RSIOBBuffer[i]=OverBought;
      RSIOSBuffer[i]=OverSold;
      i--;
   }
   
   if(AlertMode)
   {
      if(RSIBuffer[1]<OverBought && RSIBuffer[0]>=OverBought)
         Alert("RSI = "+ RSIBuffer[i]+ ", Sell.");
      else if(RSIBuffer[1]>OverSold && RSIBuffer[0]<=OverSold)
         Alert("RSI = "+ RSIBuffer[i]+ ", Buy.");
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
Как сделать так, чтобы либо в левом верхнем углу подокна (где имя и параметры индикатора обычно отображаются), либо как-то еще, указывать, включен сигнал (extern bool AlertMode=true;) или выключен?
 
Nilog:

Есть индикатор mq4 с функцией Alert.

Например:

Как сделать так, чтобы либо в левом верхнем углу подокна (где имя и параметры индикатора обычно отображаются), либо как-то еще, указывать, включен сигнал (extern bool AlertMode=true;) или выключен?
Выводите текст объектами например.
 

В документации сказано, что:

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

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

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

Примеры:

1. Объект объявлен на глобальном уровне и инициализирован в функции OnInit. К нему есть доступ из функции OnCalculate, но в функции OnChartEvent получаем сообщение об ошибке - invalid pointer

2. Есть функция, которая выводит в журнал содержимое переменной (переменная объявлена на глобальном уровне). При вызове этой функции из OnCalculate получаем ожидаемое значение, при вызове этой же функции из OnChartEvent получаем ерунду.

 

Доброго времени суток!

Столкнулась с проблемой при использовании событий, в частности функции OnChartEvent() в индикаторе. Если при использовании ее в эксперте проблем не возникало, то в индикаторе корректно работать по событию не удается. То есть событие приходит, но изменить по нему существующие поля не выходит. Пример:

//----------------------------------------------------------------------------------------------
int k;
int OnInit()
{
  k = 0;
 ihandleDE = iCustom(_Symbol, _Period, "DrawExtremums");
 //< ... >
 return(INIT_SUCCEEDED);
}

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[])
{
  Print("На OnCalculate(): k =", k);
  //< ... >
  return(rates_total);

}

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
 string nameEv = "EXTR_UP";
 if (sparam == nameEv)
 {
  Print("На OnChartEvent(): k = ", k);
  k++;

 }

}

//----------------------------------------------------------------------------------------------

В результате получаем:

"На OnCalculate(): k = 0" - всегда.

"На OnChartEvent(): k = 0,...,123332" - считает от 0 до ...

Как такое может быть и почему?!? Можно ли это как-то исправить? Если кто-то понимает, была бы очень признательна ответу. 

P.S.: Подобная несправедливость встречается только на тестере стратегий, в реальном времени все работает исправно.

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
dariamap:

Доброго времени суток!

Столкнулась с проблемой при использовании событий, в частности функции OnChartEvent() в индикаторе. Если при использовании ее в эксперте проблем не возникало, то в индикаторе корректно работать по событию не удается. То есть событие приходит, но изменить по нему существующие поля не выходит. Пример:

//----------------------------------------------------------------------------------------------
int k;
int OnInit()
{
  k = 0;
 ihandleDE = iCustom(_Symbol, _Period, "DrawExtremums");
 //< ... >
 return(INIT_SUCCEEDED);
}

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[])
{
  Print("На OnCalculate(): k =", k);
  //< ... >
  return(rates_total);

}

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
 string nameEv = "EXTR_UP";
 if (sparam == nameEv)
 {
  Print("На OnChartEvent(): k = ", k);
  k++;

 }

}

//----------------------------------------------------------------------------------------------

В результате получаем:

"На OnCalculate(): k = 0" - всегда.

"На OnChartEvent(): k = 0,...,123332" - считает от 0 до ...

Как такое может быть и почему?!? Можно ли это как-то исправить? Если кто-то понимает, была бы очень признательна ответу. 

P.S.: Подобная несправедливость встречается только на тестере стратегий, в реальном времени все работает исправно.

Добрый вечер. В свое время в сервисдеске дали по этому поводу вполне определенный ответ: терминал и тестер стратегий - две разные программы и работа советников/индикаторов в тестере и терминале может отличаться существенно. Зачастую то, что работает в терминале не работает в тестере. Пишите в сервисдеск, предоставьте доказательства и пусть исправят.
 
Tapochun:
Добрый вечер. В свое время в сервисдеске дали по этому поводу вполне определенный ответ: терминал и тестер стратегий - две разные программы и работа советников/индикаторов в тестере и терминале может отличаться существенно. Зачастую то, что работает в терминале не работает в тестере. Пишите в сервисдеск, предоставьте доказательства и пусть исправят.
Спасибо Вам большое! Я рада что проблема не во мне)
 
extern string Symbol1= "EURUSD";
extern string Symbol2= "GBRUSD";

  double Sell1=iFractals(Symbol1,240,MODE_UPPER,2);
  double Sell2=iFractals(Symbol2,240,MODE_UPPER,2);
Подскажите какую написать команду, чтобы при открытии фракталов Sell1 и Sell2 в одно время открывался ордер
Причина обращения: