Ответить
03.06.2012, 12:17
Аватар для eevviill
eevviill eevviill вне форума Заблокирован
За второе место в конкурсе 

Регистрация: 30.07.2009 / Сообщений: 5,474
Поблагодарили 9,029 раз(а) / Репутация: 9029
  • Отправить сообщение для eevviill с помощью Skype™
Хочу добавить, что алерт должен брать откуда-то сигнал, как правило если просто прописать сточку Alert(); не там, он будет сигналить постоянно, в лучшем случае молчать.
Давай кокретный пример. Разберём.
03.06.2012, 12:29
Аватар для Pavel555
Pavel555 Pavel555 вне форума Заблокирован
Регистрация: 10.02.2012 / Сообщений: 22
Поблагодарили 16 раз(а) / Репутация: 17
Давай кокретный пример. Разберём.
Я не селен в программировании но заметил один программист на этом форуме добавляет один и тотже код алерта единственное различие которое я заметил это в этих строчках
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)
Весь код выкладывать не буду, я не автор и может ему это не понравится.
03.06.2012, 12:54
Регистрация: 05.01.2012 / Сообщений: 1,149
Поблагодарили 7,800 раз(а) / Репутация: 7844
Я не селен в программировании но заметил один программист на этом форуме добавляет один и тотже код алерта единственное различие которое я заметил это в этих строчках
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 , hiys 
03.06.2012, 13:02
Аватар для eevviill
eevviill eevviill вне форума Заблокирован
За второе место в конкурсе 

Регистрация: 30.07.2009 / Сообщений: 5,474
Поблагодарили 9,029 раз(а) / Репутация: 9029
  • Отправить сообщение для eevviill с помощью Skype™
Я не селен в программировании но заметил один программист на этом форуме добавляет один и тотже код алерта единственное различие которое я заметил это в этих строчках
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); 
03.06.2012, 13:19
Регистрация: 05.01.2012 / Сообщений: 1,149
Поблагодарили 7,800 раз(а) / Репутация: 7844
При чём здесь то что ты выложил к Alert?
Он наверно имел в виду этот код.
PHP код:
   static int PrevSignal 0;
   static 
datetime PrevTime 0;
   if(
Signal_Bar && Time[0] <= PrevTime 
          return(
0);    
   
PrevTime Time[0];
   if(
PrevSignal <= || !A_EM)
      {
 if (
ibuf_84[Signal_Bar]!= EMPTY_VALUE && ibuf_84[Signal_Bar+1] == EMPTY_VALUE
      {
   
PrevSignal 1;
      
Alert("SkdonТrend ",Period()," ",Symbol()," BUY");
       }
    } 
03.06.2012, 13:30
Аватар для Pavel555
Pavel555 Pavel555 вне форума Заблокирован
Регистрация: 10.02.2012 / Сообщений: 22
Поблагодарили 16 раз(а) / Репутация: 17
Он наверно имел в виду этот код.
PHP код:
   static int PrevSignal 0;
   static 
datetime PrevTime 0;
   if(
Signal_Bar && Time[0] <= PrevTime 
          return(
0);    
   
PrevTime Time[0];
   if(
PrevSignal <= || !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 ведь их там много бывает разных?
Заранее спасибо.
03.06.2012, 13:51
Регистрация: 05.01.2012 / Сообщений: 1,149
Поблагодарили 7,800 раз(а) / Репутация: 7844
Да я и имею ввиду что отличаются
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 Методом научного тыка.
03.06.2012, 14:08
Аватар для Pavel555
Pavel555 Pavel555 вне форума Заблокирован
Регистрация: 10.02.2012 / Сообщений: 22
Поблагодарили 16 раз(а) / Репутация: 17
Есть 2 варианта
1 Ознакомится с этим _http://docs.mql4.com/ru/customind и отпадут многие вопросы.
2 Методом научного тыка.
1 вариант остовляет еще больше вопросов
2 вариант порадовал
Похоже надо сначало с самого элементарного начинать, а то меня занесло далеко.
03.06.2012, 15:45
Аватар для falerx
falerx falerx вне форума Активный участник
За призовое место в конкурсе 

Регистрация: 20.11.2011 / Сообщений: 88
Поблагодарили 107 раз(а) / Репутация: 108
Сегодня будем перебирать ордера. Для чего это нужно?
Для всего что связано с операциями по ордерам кроме открытия.
Тоесть сначало надо ордер выбрать чтобы потом модифицировать, закрыть, удалить его.

Пример.
PHP код:
 1)for(int i=OrdersTotal()+1i>=0i--)
 {
 
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.
03.06.2012, 17:35
Аватар для eevviill
eevviill eevviill вне форума Заблокирован
За второе место в конкурсе 

Регистрация: 30.07.2009 / Сообщений: 5,474
Поблагодарили 9,029 раз(а) / Репутация: 9029
  • Отправить сообщение для eevviill с помощью Skype™
Добрый день!
Лучше, наверное, брать со знаком "минус":
OrdersTotal()-1.
И что выйдет? Допустим у нас всего 6 ордеров. По твоей схеме мы начинаем перебирать с 5-го. Так как мы идём от конца к началу, то выйдет что мы 6-ой ордер не перебрали.
03.06.2012, 18:06
Аватар для spezdetal
spezdetal spezdetal вне форума Активный участник
Регистрация: 04.05.2009 / Сообщений: 91
Поблагодарили 91 раз(а) / Репутация: 89
Спасибо!! Просто и доходчиво
"Не бойся идти на встречу переменам! Бойся быть их рабом..."
05.06.2012, 19:04
Аватар для falerx
falerx falerx вне форума Активный участник
За призовое место в конкурсе 

Регистрация: 20.11.2011 / Сообщений: 88
Поблагодарили 107 раз(а) / Репутация: 108
И что выйдет? Допустим у нас всего 6 ордеров. По твоей схеме мы начинаем перебирать с 5-го. Так как мы идём от конца к началу, то выйдет что мы 6-ой ордер не перебрали.
В mql все исчисления начинаются обычно с ноля. При 6 ордерах в Вашем примере кода (с +1) перебор происходит от 7 до 0, т.е. 8 раз (позиций) при шести ордерах...

Вот выдрал из учебника:
17.06.2012, 16:18
Аватар для expforex
expforex expforex вне форума Программиров
Регистрация: 11.01.2009 / Сообщений: 2,134
Поблагодарили 2,094 раз(а) / Репутация: 2152
Сегодня будем перебирать ордера. Для чего это нужно?
Для всего что связано с операциями по ордерам кроме открытия.
Тоесть сначало надо ордер выбрать чтобы потом модифицировать, закрыть, удалить его.

Пример.
PHP код:
 1)for(int i=OrdersTotal()+1i>=0i--)
 {
 
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--)
Тогда он будет правильно перебирать ордера.

Удачи
Советники на заказ! admin@expforex.com
Говорим Спасибо
17.06.2012, 16:27
Аватар для expforex
expforex expforex вне форума Программиров
Регистрация: 11.01.2009 / Сообщений: 2,134
Поблагодарили 2,094 раз(а) / Репутация: 2152
Добрый день. Сегодня мы сделаем скрипт котрый будет закрывать ордера.
............................


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

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()-1i>=0i--)
{
if (
OrderSelect(i,SELECT_BY_POS)){
if(
Close_all_lots==trueLot=OrderLots();
if(
Close_all_lots==falseLot=Close_lot;
  
 if(
OrderMagicNumber()== Magic && OrderType()==OP_BUY && Buy==trueOrderClose(OrderTicket(),Lot,Bid,Slippage,Yellow);
 if(
OrderMagicNumber()== Magic && OrderType()==OP_SELL && Sell==trueOrderClose(OrderTicket(),Lot,Ask,Slippage,Yellow);
 if( 
OrderMagicNumber()== Magic && OrderType()==OP_BUYSTOP && BuyStop==trueOrderDelete(OrderTicket());
 if( 
OrderMagicNumber()== Magic && OrderType()==OP_SELLSTOP && SellStop==trueOrderDelete(OrderTicket());
 if(
OrderMagicNumber()== Magic && OrderType()==OP_BUYLIMIT && BuyLimit==trueOrderDelete(OrderTicket());
 if( 
OrderMagicNumber()== Magic && OrderType()==OP_SELLLIMIT && SellLimit==trueOrderDelete(OrderTicket());
}
}
   return(
0);
  } 
Ибо в Вашем примере Lot = будет вычисляться неправильно, ибо ордер мы не выбрали а уже лот ищем.
Советники на заказ! admin@expforex.com
Говорим Спасибо
20.06.2012, 13:36
Аватар для kamilkz
kamilkz kamilkz вне форума Почётный гражданин
Регистрация: 10.03.2010 / Сообщений: 297
Поблагодарили 338 раз(а) / Репутация: 339
Подскажите , пожалуйста, как можно среди всех открытых ордеров выделить наибольший лот (его чисовое значение), в виде примера, если можно.
20.06.2012, 15:38
Регистрация: 13.03.2009 / Сообщений: 2,329
Поблагодарили 1,949 раз(а) / Репутация: 2026
Подскажите , пожалуйста, как можно среди всех открытых ордеров выделить наибольший лот (его чисовое значение), в виде примера, если можно.
Код:
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 будет максимальный лот среди найденых, не исторических ордеров.
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
20.06.2012, 15:57
Аватар для eevviill
eevviill eevviill вне форума Заблокирован
За второе место в конкурсе 

Регистрация: 30.07.2009 / Сообщений: 5,474
Поблагодарили 9,029 раз(а) / Репутация: 9029
  • Отправить сообщение для eevviill с помощью Skype™

По умолчанию Урок 15 - выбор наибольшего лота среди открытых ордеров

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


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


ПРИМЕР.
PHP код:
int magic 0;

double lot;
double max_lot 0;



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

 
Alert(max_lot);

 
   return(
0);
  } 

ПОЯСНЕНИЕ.
1)Здесь мы указали что при каждом переборе ордеров, если лот выбраного ордера больше чем максимальный лот, то максмиальному лоту присваиваем значения лота выбраного ордера.
20.06.2012, 16:13
Аватар для expforex
expforex expforex вне форума Программиров
Регистрация: 11.01.2009 / Сообщений: 2,134
Поблагодарили 2,094 раз(а) / Репутация: 2152
По многочисленым заявкам сегодня будем искать величину наибольшей открытой позиции.
почему у Вас всегда OrdersTotal()+1;
Надо писать OrdersTotal()-1;Запомните это как библию
или же при i=0 просто OrdersTotal()
Советники на заказ! admin@expforex.com
Говорим Спасибо

Последний раз редактировалось expforex; 20.06.2012 в 16:19.
20.06.2012, 17:01
Регистрация: 13.03.2009 / Сообщений: 2,329
Поблагодарили 1,949 раз(а) / Репутация: 2026
почему у Вас всегда OrdersTotal()+1;
Надо писать OrdersTotal()-1;Запомните это как библию
или же при i=0 просто OrdersTotal()
Ну нравится человеку сначала выбрать 2 не существующих ордера прежде чем перейти к существующему, чё такого.
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
20.06.2012, 18:45
Аватар для kamilkz
kamilkz kamilkz вне форума Почётный гражданин
Регистрация: 10.03.2010 / Сообщений: 297
Поблагодарили 338 раз(а) / Репутация: 339
В функции:

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

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

Последний раз редактировалось kamilkz; 20.06.2012 в 18:53.
Ответить


Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Выкл.
Pingbacks are Выкл.
Refbacks are Выкл.



Текущее время: 22:42. Часовой пояс GMT.


Перевод: zCarot
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
SEO by vBSEO