Jump to content
Programmer

Общие вопросы по языку MQL

Recommended Posts

lowech

Добрый день!

Добрый день. Спасибо за помощь, только сейчас не могу понять как функцию использовать, чтобы закрывать открытые ордера, когда цена превысит в два раза сумму полученного убытка(то есть профит по открытому ордеру будет больше общего убытка по закрытым позиция в два раза.) сейчас применяю функцию в таком виде,

void CheckForClose()

  {

   for(int i=0;i<OrdersTotal();i++)

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;

      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;

      //--- check order type

      if(OrderType()==OP_BUY)

        {

         if(Bid>ClosProfit())

           {

            if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))

               Print("OrderClose error ",GetLastError());

           }

         break;

        }

      if(OrderType()==OP_SELL)

        {

         if(Bid>ClosProfit())

           {

            if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))

               Print("OrderClose error ",GetLastError());

           }

         break;

        }

     }

//---

  }

но происходит какой то сбой и метатрейдер вылетает. Подскажите пожалуйста как это можно исправить?

Share this post


Link to post
Share on other sites
Ugar68

...

   for(int i=0;i<OrdersTotal();i++)

....

Так нельзя перебирать ордера для закрытия. Надо вот так.

for(int i=OrdersTotal()-1;i>=0;i--)


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Share this post


Link to post
Share on other sites
STre

Так нельзя перебирать ордера для закрытия. Надо вот так.

for(int i=OrdersTotal()-1;i>=0;i--)

 

Иначе вы одновременно идете по циклу и удаляете. Цикл ломается...

Share this post


Link to post
Share on other sites
Vladero

Подскажите, можно ли вне функций советника, в начале файла, прописывать что-то, помимо объявления переменных?

Хочу сделать объявление переменных/массивов, только если они будут нужны, в зависимости от значения внешней переменной-переключателя. Примерно так:

​extern bool a=true; //Использовать функцию Х?
if (a==true)
 {
   int d=1;
   double TT[10];
 }
...

Так будет работать?

Share this post


Link to post
Share on other sites
AntFX
Так будет работать?

Так не будет, но можно так

 

#ifdef A_TRUE

 

int d=1;

double TT[10];

 

#endif 

 

Чтобы этот кусок потом включить, нужно вверху написать

 

#define A_TRUE

 

Включить или выключить кусок кода в зависимости от значения переменной не получится.

Edited by AntFX

1

Share this post


Link to post
Share on other sites
ToB. CyxoB

Подскажите простую вещь, пожалуйста...))

 

как в enum поместить разные значения 1.2.3.4.... в одну переменную ?  mql4 

Share this post


Link to post
Share on other sites
AntFX

 

 

как в enum поместить разные значения 1.2.3.4.... в одну переменную ?  mql4 

Каждому значению в enum должно соответствовать строго одно число


1

Share this post


Link to post
Share on other sites
ToB. CyxoB

Каждому значению в enum должно соответствовать строго одно число

а как тогда мне сделать перебор параметров переменной в свойствах советника? как выбрать 1 или 2 или 3? 

Share this post


Link to post
Share on other sites
AntFX

а как тогда мне сделать перебор параметров переменной в свойствах советника? как выбрать 1 или 2 или 3? 

Ты создаешь перечисление, потом создаешь внешнюю переменную типа перечисления, и в окне выбора параметров советника у тебя будет всплывающий список из нескольких опций.


1

Share this post


Link to post
Share on other sites
ToB. CyxoB

Ты создаешь перечисление, потом создаешь внешнюю переменную типа перечисления, и в окне выбора параметров советника у тебя будет всплывающий список из нескольких опций.

 

перечисление значений? мне нужно чтобы переменная А могла принимать значения 1,2 или 3....

Share this post


Link to post
Share on other sites
AntFX

перечисление значений? мне нужно чтобы переменная А могла принимать значения 1,2 или 3....

можешь написать так

 

enum abc{Один=1, Два=2, Три=3};

 

или так

 

enum abc2{_1=1, _2=2, _3=3};
 
элементом в перечислении (enum) должен быть идентификатор. он не может начинаться с числа (то есть элемент 1, 2 или 3 создать не получится)
Edited by AntFX
  • Thanks 1

1

Share this post


Link to post
Share on other sites
ToB. CyxoB

 

можешь написать так

 

enum abc{Один=1, Два=2, Три=3};

 

или так

 

enum abc2{_1=1, _2=2, _3=3};
 
элементом в перечислении (enum) должен быть идентификатор. он не может начинаться с числа (то есть элемент 1, 2 или 3 создать не получится)

 

 

и в коде, везде где у меня было if abc2==1.... теперь будет   if abc2==_1 ?

Share this post


Link to post
Share on other sites
AntFX
и в коде, везде где у меня было if abc2==1.... теперь будет   if abc2==_1 ?

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

 

Но если говорить о правильном стиле программирования, то этого лучше не делать... Элементам перечисления нужно давать осмысленные имена и применять только их в коде. Причем, желательно английские... А если нужно ограничить пользователя в установке других чисел в настройке кроме 1, 2 и 3 то использовать не перечисление, а обычную переменную int, и проверять в OnInit, что значение установлено в нужных рамках. Если значение отличается от нужного, выдавать сообщение в журнал и выгружать советник ( return(INIT_FAILED) ).

Edited by AntFX

1

Share this post


Link to post
Share on other sites
ToB. CyxoB

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

 

Но если говорить о правильном стиле программирования, то этого лучше не делать... Элементам перечисления нужно давать осмысленные имена и применять только их в коде. Причем, желательно английские... А если нужно ограничить пользователя в установке других чисел в настройке кроме 1, 2 и 3 то использовать не перечисление, а обычную переменную int, и проверять в OnInit, что значение установлено в нужных рамках. Если значение отличается от нужного, выдавать сообщение в журнал и выгружать советник ( return(INIT_FAILED) ).

 

цель: дать пользователю выбрать одно из двух значений: 0 или 1.  Назначить переменной abc значение 0 или 1.

 

У меня пока ничего не получилось.

enum abc{_0=0, _1=1};
и далее в коде

if (abc==_0) {Print("0 ",_0);}
if (abc==_1) {Print("1 ",_1);}

ошибка....неизвестный токен

Edited by ToB. CyxoB

Share this post


Link to post
Share on other sites
AntFX

 

 

ошибка....неизвестный токен

abc это тип, а не переменная. ты как будто вчера родился... 


1

Share this post


Link to post
Share on other sites
ToB. CyxoB

abc это тип, а не переменная. ты как будто вчера родился... 

не вчера...сегодня!  :)  никогда в жизни не пользовался этими enum-ами...  

 

напиши короткий пример, пожалуйста, законченный. 

Справку читал. не помогло))) 

объявили тип...аbc...а нафига он мне нужен? мне переменная нужна и ее значения! 

Share this post


Link to post
Share on other sites
AntFX

enum ENUM_ABC {_0=0, _1=1};

 

и далее в коде

 

ENUM_ABC abc=_0;

 

if (abc==_0) {Print("0 ",_0);}

if (abc==_1) {Print("1 ",_1);}

Edited by AntFX

1

Share this post


Link to post
Share on other sites
ToB. CyxoB

 

enum ENUM_ABC {_0=0, _1=1};

 

и далее в коде

 

ENUM_ABC abc=_0;

 

if (abc==_0) {Print("0 ",_0);}

if (abc==_1) {Print("1 ",_1);}

 

Спасибо)

Share this post


Link to post
Share on other sites
yrik735

Альтернатива есть ?

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[])
Для советника

Share this post


Link to post
Share on other sites
AntFX

 

 

Альтернатива есть ? int OnCalculate ... Для советника
 

В советниках используется OnTick()


1

Share this post


Link to post
Share on other sites
Atani

Подскажите как правильно прописать адрес для вызова программы через "kernel32.dll"

 

 

 

 

#import "kernel32.dll"
int WinExec(uchar &lpCmdLine[],uint uCmdShow);
 
#define SW_HIDE 0
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
          
          }
      uchar ucParam[];                           // определяем строковый массив
      string sParam = "C:\Xnwiew.exe";        // адрес
      ArrayResize(ucParam, StringLen(sParam)+1); // резервируем память для строкового массива
      StringToCharArray(sParam, ucParam);        // переносим текст в строковый массив
      
      int result = WinExec(ucParam,SW_HIDE);     // запуск программы
      if (result<32)
          Alert("Запуск программы не удалось. Код ошибки: ",result);
      return;
  }

 
 
  uchar ucParam[];                           // определяем строковый массив
      string sParam = "C:\Xnwiew.exe";        // Вот пишу этот адрес, но ничего не происходит, как задать его?
      ArrayResize(ucParam, StringLen(sParam)+1); // резервируем память для строкового массива
      StringToCharArray(sParam, ucParam);        // переносим текст в строковый массив
      
      int result = WinExec(ucParam,SW_HIDE);     // запуск программы
      if (result<32)
          Alert("Запуск программы не удалось. Код ошибки: ",result);
      return;

 

Share this post


Link to post
Share on other sites
Neona

Здравствуйте! Подскажите пожалуйста, в  MQL4 приказ о покупке и выбор ордера выглядят так:

 

OrderSend(NULL,OP_BUY,0.5,Ask,10,SL_b,0,NULL,0,0,clrNONE);

 

OrderSelect(12345,SELECT_BY_POS)

 

Как эти приказы пишутся в  MQL5 ???

Share this post


Link to post
Share on other sites
AntFX

 

 

Как эти приказы пишутся в  MQL5 ???
 

Добрый день! Вот здесь в справке все подробно описано с примерами.


1

Share this post


Link to post
Share on other sites
Стяжатель

У меня такой вопрос. Не могу разобраться с временем в котировках. Как нивелировать влияние часового пояса и переход с летнего времени на зимнее? 

Share this post


Link to post
Share on other sites
Стяжатель

Еще вопрос. Есть такая функция Push. Отправляет на мобильный терминал сообщение о событиях. С этой функцией кто то работал? Насколько все происходит без сбоев?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×