Уроки по программированию на языке MQL4 от eevviill

eevviill

Заблокирован
Хочу добавить, что алерт должен брать откуда-то сигнал, как правило если просто прописать сточку Alert(); не там, он будет сигналить постоянно, в лучшем случае молчать.
Давай кокретный пример. Разберём.
 

Pavel555

Заблокирован
Давай кокретный пример. Разберём.

Я не селен в программировании но заметил один программист на этом форуме добавляет один и тотже код алерта единственное различие которое я заметил это в этих строчках
if (g_ibuf_100[Signal_Bar]!= EMPTY_VALUE && g_ibuf_100[Signal_Bar+1] == EMPTY_VALUE)

if (Buffer1[Signal_Bar]!= EMPTY_VALUE && Buffer1[Signal_Bar+1] == EMPTY_VALUE)
Весь код выкладывать не буду, я не автор и может ему это не понравится.
 

strannik-ps

VIP-участник
Я не селен в программировании но заметил один программист на этом форуме добавляет один и тотже код алерта единственное различие которое я заметил это в этих строчках
if (g_ibuf_100[Signal_Bar]!= EMPTY_VALUE && g_ibuf_100[Signal_Bar+1] == EMPTY_VALUE)

if (Buffer1[Signal_Bar]!= EMPTY_VALUE && Buffer1[Signal_Bar+1] == EMPTY_VALUE)
Весь код выкладывать не буду, я не автор и может ему это не понравится.

Да значение берется из

SetIndexBuffer()
 

eevviill

Заблокирован
Я не селен в программировании но заметил один программист на этом форуме добавляет один и тотже код алерта единственное различие которое я заметил это в этих строчках
if (g_ibuf_100[Signal_Bar]!= EMPTY_VALUE && g_ibuf_100[Signal_Bar+1] == EMPTY_VALUE)

if (Buffer1[Signal_Bar]!= EMPTY_VALUE && Buffer1[Signal_Bar+1] == EMPTY_VALUE)
Весь код выкладывать не буду, я не автор и может ему это не понравится.
При чём здесь то что ты выложил к Alert?

Короче пример.
Алерт при пересечении МА цены сверху вниз.
PHP:
double MA1 = iMA(Symbol(),0,60,0,MODE_LWMA,PRICE_CLOSE,1); 
double MA2 = iMA(Symbol(),0,60,0,MODE_LWMA,PRICE_CLOSE,2);
 
if((MA2>Close[2]) && MA1<Close[1]) Alert("MA under Price");
или так
PHP:
double MA1 = iMA(Symbol(),0,60,0,MODE_LWMA,PRICE_CLOSE,1); 
double MA2 = iMA(Symbol(),0,60,0,MODE_LWMA,PRICE_CLOSE,2);
 
int sig = 1;
if((MA2>Close[2]) && MA1<Close[1]) sig = 2;
Alert(sig);
 

strannik-ps

VIP-участник
При чём здесь то что ты выложил к Alert?
Он наверно имел в виду этот код.
PHP:
   static int PrevSignal = 0;
   static datetime PrevTime = 0;
   if(Signal_Bar > 1 && Time[0] <= PrevTime ) 
	      return(0);	
   PrevTime = Time[0];
   if(PrevSignal <= 0 || !A_EM)
      {
 if (ibuf_84[Signal_Bar]!= EMPTY_VALUE && ibuf_84[Signal_Bar+1] == EMPTY_VALUE) 
      {
   PrevSignal = 1;
      Alert("SkdonТrend ",Period()," ",Symbol()," BUY");
       }
    }
 

Pavel555

Заблокирован
Он наверно имел в виду этот код.
PHP:
   static int PrevSignal = 0;
   static datetime PrevTime = 0;
   if(Signal_Bar > 1 && Time[0] <= PrevTime ) 
	      return(0);	
   PrevTime = Time[0];
   if(PrevSignal <= 0 || !A_EM)
      {
 if (ibuf_84[Signal_Bar]!= EMPTY_VALUE && ibuf_84[Signal_Bar+1] == EMPTY_VALUE) 
      {
   PrevSignal = 1;
      Alert("SkdonТrend ",Period()," ",Symbol()," BUY");
       }
    }
Да я и имею ввиду что отличаются
if (ibuf_84[Signal_Bar]!= EMPTY_VALUE && ibuf_84[Signal_Bar+1] == EMPTY_VALUE)

авот с другого индикатора
if (g_ibuf_100[Signal_Bar]!= EMPTY_VALUE && g_ibuf_100[Signal_Bar+1] == EMPTY_VALUE)
А как понять что надо брать из SetIndexBuffer ведь их там много бывает разных?
Заранее спасибо.
 

strannik-ps

VIP-участник
Да я и имею ввиду что отличаются
if (ibuf_84[Signal_Bar]!= EMPTY_VALUE && ibuf_84[Signal_Bar+1] == EMPTY_VALUE)

авот с другого индикатора
if (g_ibuf_100[Signal_Bar]!= EMPTY_VALUE && g_ibuf_100[Signal_Bar+1] == EMPTY_VALUE)
А как понять что надо брать из SetIndexBuffer ведь их там много бывает разных?
Заранее спасибо.

Есть 2 варианта
1 Ознакомится с этим _http://docs.mql4.com/ru/customind и отпадут многие вопросы.
2 Методом научного тыка.
 

Pavel555

Заблокирован
Есть 2 варианта
1 Ознакомится с этим _http://docs.mql4.com/ru/customind и отпадут многие вопросы.
2 Методом научного тыка.

1 вариант остовляет еще больше вопросов:fa:
2 вариант порадовал:rolf:
Похоже надо сначало с самого элементарного начинать, а то меня занесло далеко.
 

falerx

Активный участник
Сегодня будем перебирать ордера. Для чего это нужно?
Для всего что связано с операциями по ордерам кроме открытия.
Тоесть сначало надо ордер выбрать чтобы потом модифицировать, закрыть, удалить его.

Пример.
PHP:
 1)for(int i=OrdersTotal()+1; i>=0; i--)
 {
 2)OrderSelect(i,SELECT_BY_POS);
 {
 3)if(OrderMagicNumber()==magic)
 {
 4)if(OrderType()==OP_BUY...) OrderClose(OrderTicket(),Lot,Bid,slippage,Yellow); 
 }
 }
 }

1)Собственно это и есть перебор ордеров функцией for.
1.1)Начинаем с общего количества ордеров+1.
1.2)Будем продолжать пока ордеров будет 0 или больше.
1.3)На каждом переборе будем уменьшать количество перебираемых ордеров на 1.
2)Функция OrderSelect(); С помощью неё мы выбираем конкретный ордер. В нашем слачае (порядковый номер в терминале i, из тех что находятся в закладке торговля).
3)После того как выбрали ордер проверяем или это ордер нашего советника. Проверку делаем с помощью меджик намбера, который должен совпадать с меджиком открытого ордера.
4)Здесь уже проводятся конкретные действия. Например если ордер бай и
цена пересекла МА сверху вниз закрываем ордер.

Добрый день!
Лучше, наверное, брать со знаком "минус":
OrdersTotal()-1. :question:
 

eevviill

Заблокирован
Добрый день!
Лучше, наверное, брать со знаком "минус":
OrdersTotal()-1. :question:
И что выйдет? Допустим у нас всего 6 ордеров. По твоей схеме мы начинаем перебирать с 5-го. Так как мы идём от конца к началу, то выйдет что мы 6-ой ордер не перебрали.
 

falerx

Активный участник
И что выйдет? Допустим у нас всего 6 ордеров. По твоей схеме мы начинаем перебирать с 5-го. Так как мы идём от конца к началу, то выйдет что мы 6-ой ордер не перебрали.

В mql все исчисления начинаются обычно с ноля. При 6 ордерах в Вашем примере кода (с +1) перебор происходит от 7 до 0, т.е. 8 раз (позиций) при шести ордерах...

Вот выдрал из учебника:
 

Вложения

  • book_OrdSel.jpg
    book_OrdSel.jpg
    69,6 КБ · Просмотры: 70

expforex

Программиров
Сегодня будем перебирать ордера. Для чего это нужно?
Для всего что связано с операциями по ордерам кроме открытия.
Тоесть сначало надо ордер выбрать чтобы потом модифицировать, закрыть, удалить его.

Пример.
PHP:
 1)for(int i=OrdersTotal()+1; i>=0; i--)
 {
 2)OrderSelect(i,SELECT_BY_POS);
 {
 3)if(OrderMagicNumber()==magic)
 {
 4)if(OrderType()==OP_BUY...) OrderClose(OrderTicket(),Lot,Bid,slippage,Yellow); 
 }
 }
 }

1)Собственно это и есть перебор ордеров функцией for.
1.1)Начинаем с общего количества ордеров+1.
1.2)Будем продолжать пока ордеров будет 0 или больше.
1.3)На каждом переборе будем уменьшать количество перебираемых ордеров на 1.
2)Функция OrderSelect(); С помощью неё мы выбираем конкретный ордер. В нашем слачае (порядковый номер в терминале i, из тех что находятся в закладке торговля).
3)После того как выбрали ордер проверяем или это ордер нашего советника. Проверку делаем с помощью меджик намбера, который должен совпадать с меджиком открытого ордера.
4)Здесь уже проводятся конкретные действия. Например если ордер бай и
цена пересекла МА сверху вниз закрываем ордер.

ордеров 10,
Вы ставите 10+1 пока i>=0
означает что он буде перебирать 12 ордеров. А в реале их 10
Все массивы имеют первый элемент под пунктом 0, в Вашем примере нужно писать так:

for(int i=OrdersTotal()-1; i>=0; i--)
Тогда он будет правильно перебирать ордера.

Удачи
 

expforex

Программиров
Добрый день. Сегодня мы сделаем скрипт котрый будет закрывать ордера.
............................



Правильней будет так:

PHP:
#property copyright "eevviill"
#property show_inputs
extern string TO = "??? ?????? ??? ????????";
extern bool Buy = false;
extern bool Sell = false;
extern bool BuyStop = false;
extern bool SellStop = false;
extern bool BuyLimit = false;
extern bool SellLimit = false;
extern bool Close_all_lots = true;
extern double Close_lot = 0.1;
double Lot;
extern int Magic = 0;
extern int Slippage = 4;
 

int start()
  {

for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i,SELECT_BY_POS)){
if(Close_all_lots==true) Lot=OrderLots();
if(Close_all_lots==false) Lot=Close_lot;
  
 if(OrderMagicNumber()== Magic && OrderType()==OP_BUY && Buy==true) OrderClose(OrderTicket(),Lot,Bid,Slippage,Yellow);
 if(OrderMagicNumber()== Magic && OrderType()==OP_SELL && Sell==true) OrderClose(OrderTicket(),Lot,Ask,Slippage,Yellow);
 if( OrderMagicNumber()== Magic && OrderType()==OP_BUYSTOP && BuyStop==true) OrderDelete(OrderTicket());
 if( OrderMagicNumber()== Magic && OrderType()==OP_SELLSTOP && SellStop==true) OrderDelete(OrderTicket());
 if(OrderMagicNumber()== Magic && OrderType()==OP_BUYLIMIT && BuyLimit==true) OrderDelete(OrderTicket());
 if( OrderMagicNumber()== Magic && OrderType()==OP_SELLLIMIT && SellLimit==true) OrderDelete(OrderTicket());
}
}
   return(0);
  }

Ибо в Вашем примере Lot = будет вычисляться неправильно, ибо ордер мы не выбрали а уже лот ищем.
 

kamilkz

Почетный гражданин
Подскажите , пожалуйста, как можно среди всех открытых ордеров выделить наибольший лот (его чисовое значение), в виде примера, если можно.
 

Ugar

Гуру форума
Подскажите , пожалуйста, как можно среди всех открытых ордеров выделить наибольший лот (его чисовое значение), в виде примера, если можно.
Код:
int total=OrdersTotal();
double MaximumLot=0;
for(int p=0; p<total; p++)
   {
   OrderSelect(p, SELECT_BY_POS, MODE_TRADES);
   MaximumLot=MathMax(MaximumLot,OrderLots());
   }
В переменной MaximumLot будет максимальный лот среди найденых, не исторических ордеров.
 

eevviill

Заблокирован
Урок 15 - выбор наибольшего лота среди открытых ордеров

По многочисленым заявкам сегодня будем искать величину наибольшей открытой позиции.


Пишу всё необходимое для нахождения.


ПРИМЕР.
PHP:
int magic = 0;

double lot;
double max_lot = 0;



int start()
  {
  
for(int i=OrdersTotal()+1; i>=0; i--)
 {
 OrderSelect(i,SELECT_BY_POS);
 {
 if(OrderMagicNumber()==magic)
 {
 lot=OrderLots();
 
 1)if(lot>max_lot) max_lot=lot;
 }
 }
 }  

 Alert(max_lot);

 
   return(0);
  }


ПОЯСНЕНИЕ.
1)Здесь мы указали что при каждом переборе ордеров, если лот выбраного ордера больше чем максимальный лот, то максмиальному лоту присваиваем значения лота выбраного ордера.
 

expforex

Программиров
По многочисленым заявкам сегодня будем искать величину наибольшей открытой позиции.

почему у Вас всегда OrdersTotal()+1;
Надо писать OrdersTotal()-1;Запомните это как библию
или же при i=0 просто OrdersTotal()
 
Последнее редактирование:

Ugar

Гуру форума
почему у Вас всегда OrdersTotal()+1;
Надо писать OrdersTotal()-1;Запомните это как библию
или же при i=0 просто OrdersTotal()
Ну нравится человеку сначала выбрать 2 не существующих ордера прежде чем перейти к существующему, чё такого. :)
 

kamilkz

Почетный гражданин
В функции:

if (OrderSelect(i,SELECT_BY_POS) && (OrderType()==OP_BUY || OrderType()==OP_SELL))

выбор будет произведен только среди открытых ордеров (без участия отложенных)? Если я не прав, поправьте.
А еще: в скрипт закрывающий ордера, можно добавить проверку по ТП и СЛ и затем только закрывать ордера?
 
Последнее редактирование:
Верх